2016-09-16 5 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) 

Тогда, на ваш взгляд, вы можете ссылаться на отношения как обычно, не касаясь базы данных снова, поскольку таблицы были загружены в память с помощью метода includes.

Для условного это поможет:

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