在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等的人的旁注,我发现关系表方法更容易处理和控制
感谢并为混淆道歉
答案 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 %>