Ассоциации модели длинной цепи Rails

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

#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 через эту цепочку?


person Almaron    schedule 19.03.2012    source источник
comment
Я пробовал прямой путь a.model_cs.model_es, но он явно не работает.   -  person Almaron    schedule 19.03.2012
comment
Я пытался написать запрос сам, но у меня это не очень хорошо получается, и это выглядит слишком сложно.   -  person Almaron    schedule 19.03.2012


Ответы (1)


Вызов 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.

person Robin Fisher    schedule 19.03.2012
comment
Спасибо, я думал о чем-то подобном, но думал, что есть что-то попроще. - person Almaron; 19.03.2012
comment
Вы можете сократить код, используя map. Следующее (непроверенное) должно работать array = @model_a.model_cs.map{|x| x.model_es}. Это делает то же самое, но в более краткой форме. - person Robin Fisher; 19.03.2012
comment
Вы можете сократить его еще больше, используя синтаксический сахар: @model_a.model_cs.map(&:model_es). Вы также можете вызвать flatten и uniq для результата, в зависимости от ваших требований. - person Brandan; 19.03.2012