includes and has_many :through associations


I’ve been trying to mentally absorb how includes and associations work when trying to query a has_many :through association.

My understanding at this point:

The symbol in the includes() is the same as the association name on whatever model you have. For example:

class Account < ActiveRecord::Base
  has_many :account_destinations
  has_many :destinations, through: :account_destinations
end

class AccountDestination < ActiveRecord::Base
  has_one :destination
  # has an active_destination attribute
end

class Destination < ActiveRecord::Base
  # has several attributes that we might want to use to filter account_destinations on
end

The association used in includes for account_destinations.includes is :destination, because AccountDestination has_one :destination. Meanwhile, in the where clause, the hash key for specifying what values to match in Destination refers to the table name, or destinations.

class Account
.
.
  def some_method
    account_destinations.includes(:destination)
      .where
      .not(destinations: { name: %w(some list of names) } )
  end
end

%d bloggers like this: