When Your Join Table Needs Its Own Logic: Choosing has_many :through in Rails
Choose has_many :through when your many-to-many relationship carries data or behavior—like appointment dates, statuses, or notifications. The join model becomes a first-class Active Record object with validations, callbacks, and scopes, keeping domain logic where it belongs.