Rails .each显示一次重复结果

时间:2014-07-29 15:19:50

标签: ruby-on-rails each uniq

在rails .each代码中,如何消除结果中的重复项?

PMRelationships是一个关联人和电影的关系表 MGRelationships是一个链接流派和电影的关系表

我正在寻找的过程是通过第一个PmRelationship然后MgRelationship找到All a Person的类型

<% @pm_relationships = PmRelationship.where(:people_id => @person.id) %>

<ul class="basic-info-genres">
  <% @pm_relationships.each do |pm_relationship| %>
    <% @movie=Movie.find(pm_relationship.movie_id) %>
    <% @mg_relationships = MgRelationship.where(:movie_id => @movie.id) %>
    <% @mg_relationships.each do |mg_relationship| %>
      <% @genre=Genre.find(mg_relationship.genre_id) %>
      <%= @genre.name %>
    <% end %>
  <% end %>
</ul>

例如,此代码返回值列表,如下所示:

动作 行动 喜剧 惊悚 冒险 比诺 操作

我怎样才能使它删除两个Lorems并只显示一个

基本上,摆脱任何重复以返回列表

动作 喜剧 惊悚 冒险 比诺

更新

我已将我的简化代码更改为与我的实际应用

相匹配

我知道大多数这需要在控制器中,但简化的缘故我首先在视图中这样做

对于那些可以提及我不需要创建_Relationship表并且可以简单地使用模型has_many_belongs_to等的人的旁注,我发现关系表方法更容易处理和控制

感谢并为混淆道歉

5 个答案:

答案 0 :(得分:1)

尝试替换原始代码:

<% @mg_relationships.each do |mg_relationship| %>
<% @genre=Genre.find(mg_relationship.genre_id) %>
  <%= @genre.name %>
<% end %>

要:(此版本没有破坏您的代码结构,只需更改输出代码的位置)

<% genre_names = []%>
<% @mg_relationships.each do |mg_relationship| %>
<% @genre=Genre.find(mg_relationship.genre_id) %>
  <%#= @genre.name %>
  <% genre_names |= [@genre.name]%>
<% end %>

<%= genre_names %> or <%= genre_names.join(" ") %>

答案 1 :(得分:1)

如您所知,您可以使用associations,我强烈推荐它。它将帮助您清理代码并保存数据库查询。

另一件事,你在<li></li>内缺少<ul></ul>

无论如何,根据您当前的代码,您只需填充@genre.name

中的所有Set即可
# as you said in question, following code should be moved to controller
genre_names = Set.new
<% @pm_relationships = PmRelationship.where(:people_id => @person.id) %>

<% @pm_relationships.each do |pm_relationship| %>
  <% @movie=Movie.find(pm_relationship.movie_id) %>
  <% @mg_relationships = MgRelationship.where(:movie_id => @movie.id) %>

  <% @mg_relationships.each do |mg_relationship| %>
    <% @genre=Genre.find(mg_relationship.genre_id) %>
    <% genre_names.add(@genre.name) %>    
  <% end %>
<% end%>

# actual view code
<ul class="basic-info-genres">
  <%= "<li>#{genre_names.to_a.join('</li><li>')}</li>".html_safe %>
</ul>

您可能希望详细了解Set

注意:将代码移动到相应的文件后,根据需要在控制器和视图中使用适当的变量类型

答案 2 :(得分:0)

使用uniq上的Array方法,您将能够删除重复项。

请参阅此处以供参考:http://www.ruby-doc.org/core-2.1.2/Array.html#method-i-uniq

答案 3 :(得分:0)

<% @worlds.collect(&:latin).uniq.each do |latin| %>
  <%= latin.name %>
<% end %>

这假设世界和拉丁语之间存在belongs_to关联(我假设这是因为World#latin_id字段,而且有一个名为Latin的模型)。

编辑:如果您有多个具有相同名称的拉丁文对象,则收集名称,然后执行uniq

<% @worlds.collect(&:latin).collect(&:name).uniq.each do |name| %>
  <%= name %>
<% end %>

答案 4 :(得分:0)

你可以尝试这个来获得独特的拉丁名称

 <% @worlds.collect(&:latin).collect(&:name).uniq.each do |latin_name| %>
   <%= latin_name %>
<% end %>