2014-12-05 2 views
0

Модели:ActiveModel пройти вверх по дереву

Companies(has_many) -> (belongs_to)Clients(has_many) -> (belongs_to)Properties 

Получение списков спускаясь легко сделать:

company.clients -> shows all clients for that company 
client.properties -> show all properties for that client 

То, что я хочу сделать, это, чтобы показать все свойства (маршрут: properties_path), но только для одной компании и предоставления ссылки клиенту в представлении.

У меня есть несколько решений:

  • Пишущие правое внешнее соединение в SQL (использует SQLite в моем окр развития так нужно Postgress, чтобы заставить его работать)
    • перебором Сквозные: получить все клиенты для этой компании, а затем принести на клиента все свойства в 1-хэша

Так м Вопрос в том, есть ли более элегантный и, возможно, рельсы способ сделать это, что я пропал?

Я исследовал уже включенные. Но это мой вопрос:

[4] pry(main)> @company = Company.includes(clients: [:properties]).find(1)                          
    Company Load (0.2ms) SELECT "companies".* FROM "companies" WHERE "companies"."id" = ? LIMIT 1 [["id", 1]]                 
    Client Load (3.5ms) SELECT "clients".* FROM "clients" WHERE "clients"."company_id" IN (1)                      
    Property Load (5.9ms) SELECT "properties".* FROM "properties" WHERE "properties"."client_id" IN (2, 12)                  
=> #<Company id: 1, name: "coolDEVOPS2", created_at: "2014-10-31 11:05:05", updated_at: "2014-11-25 09:27:38">                 
[5] pry(main)> 

Я не получаю свойства обратно?

решаемые: Я это глупо там ЭСО/подглядывать печатает только первую запись :)

@ company.properties работает :)

ответ

0

Вы можете использовать имеет много сквозных для этого, и рельсы достаточно умны, чтобы справиться с этим.

class Company 
    has_many :clients 
    has_many :properties, through: :clients 
end 

class Client 
    belongs_to :company 
    has_many :properties 
end 

class Property 
    belongs_to :client 
end 

@company = Company.find(1) 
@company.properties 

Но учитывая вы хотите ссылку на клиент тоже я предполагаю, что вы хотите перебрать клиентов и для каждого клиента показывают свойства, так что вы хотите жадную загрузку

Company.includes(clients: [:properties]).find(1) 
+0

Я был изучение включает в себя. Но даже с помощью:: клиентов я получаю только данные компании, а не свойства. – gtheys

+0

Также использовал .select и, похоже, не получил результата ... Возможно, я сделал это неправильно. – gtheys

+0

Вам не нужно использовать has_many для активной загрузки. –

Смежные вопросы