2016-09-16 52 views
0

我正在嘗試減少正在減慢速度的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 

這裏的地址表是polymporphic而接觸 - 客戶關聯是一個一對多的。地址和聯繫人模型每個都有布爾屬性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' 

任何幫助將大大appreicated!

回答

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

然後在您的視圖中,可以參考作爲正常的關係,而不因爲表已經加載到內存中通過包括方法再次觸摸數據庫。

對於條件語句,這將幫助:

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