2016-09-16 2 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입니다 :이 예제에서 나는 세 가지 모델 클라이언트, 주소 및 연락처가. 주소 및 연락처 모델에는 각각 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)