2012-03-19 2 views
0

Ну, я знаю, как обрабатывать ассоциации из одной модели (назовем ее ModelA) через вторую (ModelB) на третью (ModelC). Но что, если третий (ModelC) связан с fith (ModelE) через 4-й (ModelD).Ассоциации ассоциаций длинной цепи Rais

#ModelA 
has_many :model_bs 
has_many :model_cs, :trough => :model_bs 

#ModelC 
has_many :model_ds 
has_many :model_es, :trough => model_ds 

Вопрос: как я могу получить коллекцию Modele записей, связанную с конкретным Modela звукозаписывающего корытом, что цепи?

+0

Я пробовал прямой путь a.model_cs.model_es, но он работает не так. – Almaron

+0

Я сам пытался написать запрос, но я не очень хорош в этом, и он выглядит слишком сложным. – Almaron

ответ

2

Вызов model_cs по экземпляру ModelA будет возвращать массив model_cs. Если вы хотите получить доступ ко всем model_es, вам нужно будет перебрать массив из model_cs и добавить эти результаты в массив или хэш.

array1 = @model_a.model_cs.all 
array2 = [] 
array1.each do |x| 
    array2 << x.model_es 
end 

array2 теперь содержит все model_es, конечный родитель оригинал model_a.

+0

Спасибо, я думал о чем-то подобном, но думал, что есть что-то более простое. – Almaron

+0

Вы можете сократить код с помощью 'map'. Следующий (непроверенный) должен работать 'array = @ model_a.model_cs.map {| x | x.model_es} '. Это делает то же самое, но в более короткой форме. –

+2

Вы можете сократить его еще больше, используя синтаксический сахар: '@ model_a.model_cs.map (&: model_es)'. Вы также можете вызвать «flatten» и «uniq» на результат, в зависимости от ваших требований. – Brandan

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