我正在尝试减少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'
任何帮助都会有很大的帮助!
答案 0 :(得分:0)
localStorage
然后在您的视图中,您可以正常引用这些关系,而无需再次触及数据库,因为这些表已通过includes方法加载到内存中。
对于条件,这将有所帮助:
@clients = Client.includes([:contacts, :addresses]).where(some_parameters)