Ruby on rails Union select无复制| Ruby on Rails

Ruby on rails Union select无复制| Ruby on Rails,ruby-on-rails,union,Ruby On Rails,Union,这应该是一个简单的问题,但我发现它相当困难,我有两个模型:Amodel和Bmodel,这些模型与另外两个模型相关:Acompositions和Bcompositions,其中包含属性:aname和bname 最初,我在两个表中呈现名称,每个模型一个表。例如,对于模型A: <% @amodel.acompositions.each do |acomposition| %> <tr> <td><%= Amodel.find(acompositi

这应该是一个简单的问题,但我发现它相当困难,我有两个模型:Amodel和Bmodel,这些模型与另外两个模型相关:Acompositions和Bcompositions,其中包含属性:aname和bname

最初,我在两个表中呈现名称,每个模型一个表。例如,对于模型A:

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

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

<% end %>


现在我想做同样的事情,但只使用一个选项卡来呈现所有的名称,我教过我可以在两个选项卡之间使用并集,而不需要重复。但是我不知道该怎么做,因为属性没有相同的名称。

首先,您不应该在视图中使用
find
,这违反了MVC原则

其次,
Amodel.find(acomposition.Amodel\u id)
应该表示为
acomposition.Amodel
,如果您正确设置了关系(这看起来像是一个组件
属于:Amodel
)。(然而,这让我感到困惑……由
a组合所指向的模型。amodel_id
是否就是您以前拥有的
@amodel
?如果不是,则有某种气味。)就目前而言,这看起来非常低效

因此,您可以在控制器中找到所有的amodel和bmodel,提取名称,并对结果数组进行压缩。如果不玩你的模型关系,因为我不确定我是否理解它们,你可以:

model_names =
  @amodel.acompositions.map { |acomposition|
    Amodel.find(acomposition.amodel_id).aname
  } +
  @bmodel.bcompositions.map { |bcomposition|
    Bmodel.find(bcomposition.bmodel_id).bname
  }
然后,在你看来,只需迭代一下

如果您不能做到这一点,我强烈建议您澄清您的问题(并包括相关关系)。

效果非常好!最后使用“.uniq”以避免重复。关于find函数,你是对的,我正在尝试更正一下。非常感谢。