急切加载具有多个条件的多个 rails 关联

Eager Loading multiple rails associations with multiple conditions

我正在尝试减少 n+1 个拖慢速度的查询。在这个例子中,我有三个模型客户、地址和联系人:

class Client < ApplicationRecord
  has_many :addresses, as: :addressable
  has_many :contacts
end

class Addresses < ApplicationRecord
  belongs_to :addressable, polymorphic: true, optional: true
end

class Contacts < ApplicationRecord
  belongs_to :clients
end

这里的地址 table 是多态的,而联系人-客户关联是一对多的。地址和联系人模型各有一个布尔属性 is_primary。

我想要做的是有一个客户索引页面,其中 table 显示客户姓名、主要联系人和主要地址。以下 sql 查询实现了这一点,但我想知道如何最好地使用 ActiveRecord 做到这一点。

SELECT clients.id, clients.name, contacts.first_name,
contacts.last_name, addresses.city, addresses.state, 
addresses.country
FROM clients 
INNER JOIN contacts ON contacts.client_id = clients.id
INNER JOIN addresses ON addresses.addressable_id = clients.id
WHERE contacts.is_primary = TRUE AND addresses.is_primary = TRUE 
AND addresses.addressable_type = 'Client' 

如有任何帮助,我们将不胜感激!

@clients = Client.includes([:contacts, :addresses]).where(some_parameters)

然后在您的视图中,您可以正常引用关系而无需再次接触数据库,因为表已通过 includes 方法加载到内存中。

对于条件句,这将有所帮助:

Client.includes([:contacts, :addresses]).where('contact.name = ?', 'example').references(:contacts)