联盟选择没有重复| Ruby on Rails

时间:2014-07-22 08:31:04

标签: ruby-on-rails union

这应该是一个简单的问题,但我发现它很安静,我有两个模型:Amodel和Bmodel,这些模型与另外两个模型相关:包含属性的组合和Bcompositions:aname anb bname。

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

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

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

<% end %>

现在我想做同样的事情,但只使用一个标签来呈现所有名称,我教我可以使用两个标签之间没有重复的联合。但鉴于属性名称不同,我不知道该怎么做。

1 个答案:

答案 0 :(得分:1)

首先,你不应该在视图中使用find - 它违反了MVC原则。

其次,如果您正确设置了关系,Amodel.find(acomposition.amodel_id)应该表示为acomposition.amodel(这看起来像Acomposition belongs_to :amodel)。 (但是,这让我感到困惑...... acomposition.amodel_id所指出的模型不应该是你之前的@amodel吗?如果不是,那就有气味了。)就目前而言,这看起来非常低效

所以,你可以做的是找到控制器中的所有Amodels和Bmodel,提取名称,并使得到的数组变得模糊。没有玩你的模特关系因为我不确定我理解它们,你可以这样做:

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

然后在你的视图中迭代它。

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