2016-09-16 8 views
0

私は物事を遅くするn + 1のクエリを減らそうとしています。この例では、私は三つのモデルクライアント、住所、連絡先を持っている:Eager複数の条件との複数のレールの関連付けをロードする

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ある - クライアントアソシエーションが1対多です。アドレスと連絡先モデルにはそれぞれ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
@clients = Client.includes([:contacts, :addresses]).where(some_parameters) 

次に、あなたのビューで使用すると、テーブルが含まれるメソッドを介してメモリにロードされているので、データベースを再び触れることなく、通常のような関係を参照することができます。

条件文では、これは役立ちます:

Client.includes([:contacts, :addresses]).where('contact.name = ?', 'example').references(:contacts) 
関連する問題