渴望加载具有多个条件的多个rails关联

时间:2016-09-16 18:58:57

标签: ruby-on-rails ruby postgresql activerecord eager-loading

我正在尝试减少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

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

我想要做的是拥有一个客户端索引页面,其中包含一个显示客户端名称,主要联系人和主要地址的表。以下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' 

任何帮助都会有很大的帮助!

1 个答案:

答案 0 :(得分:0)

localStorage

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

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

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