Выбор Союза без дублирования | Рубин на рельсах

это должен быть простой вопрос, но я нахожу его спокойным, у меня две модели: Amodel и Bmodel, и эти модели связаны с двумя другими моделями: Acompositions и Bcompositions, содержащими атрибуты: aname anb bname.

Первоначально я выдаю имена в двух таблицах, по одному для каждой модели. Например, для модели A:

<% @amodel.acompositions.each do |acomposition| %>

 
 <%= Amodel.find(acomposition.amodel_id).aname %> 
 

<% end %>

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

1 ответ

Прежде всего, вы не должны find внутри представления - это нарушает принципы MVC.

Во-вторых, Amodel.find(acomposition.amodel_id) должен быть acomposition.amodel как acomposition.amodel если вы правильно настроили свои отношения (это выглядит как belongs_to :amodel). (Тем не менее, это меня смущает... не должна ли модель, acomposition.amodel_id самой @amodel вы имели раньше? Если это не так, что-то пахнет.) В ее нынешнем виде это выглядит очень неэффективно.

Итак, что вы можете сделать, это найти все Amodels и Bmodels в контроллере, извлечь имена и сгладить результирующие массивы. Не играя с вашими модельными отношениями, поскольку я не уверен, что понимаю их, вы можете сделать:

model_names =
 @amodel.acompositions.map { |acomposition|
 Amodel.find(acomposition.amodel_id).aname
 } +
 @bmodel.bcompositions.map { |bcomposition|
 Bmodel.find(bcomposition.bmodel_id).bname
 }

и тогда, на ваш взгляд, просто перебирайте это.

Если вы не можете этого сделать, я настоятельно рекомендую вам уточнить ваш вопрос (и включить соответствующие отношения).

licensed under cc by-sa 3.0 with attribution.