Rails .each显示一次重复结果
在rails .each
代码中,如何从结果中消除重复?
PMRelationships是一个链接人和电影的关系表MGRelationships是一个链接流派和电影的关系表
我正在寻找的过程是通过第一个PmRelationship然后MgRelationship找到All a Person的类型
@person.id) %> @movie.id) %>
例如,此代码返回值列表,如下所示:
动作动作喜剧惊悚冒险黑色行动
我怎样才能使它删除两个Lorems而只显示一个Lorems
基本上,摆脱任何重复以返回列表
动作喜剧惊悚冒险黑色
UPDATE
我已经更改了我的简化代码以匹配我的实际应用程序
我知道大部分需要在控制器中,但简化的缘故我首先在视图中这样做
那些可以提到我不需要创建_Relationship表并且可以简单地使用模型has_many_belongs_to等的人注意到,我发现关系表方法更容易处理和控制
感谢和混淆道歉
如您所知,您可以使用associations
,我强烈推荐它。 它将帮助您清理代码并保存数据库查询。
另一件事,你在
里面缺少
。
无论如何,根据您当前的代码,您可以在Set
填充所有@genre.name
# 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 <%= "- #{genre_names.to_a.join('
- ')}
".html_safe %>
您可能希望了解有关Set的更多信息
注意:将代码移动到相应的文件后,根据需要在控制器和视图中使用适当的变量类型
尝试替换原始代码:
<% @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(" ") %>
在Array
上使用uniq
方法,您将能够删除重复项。
请参阅此处以供参考: http : //www.ruby-doc.org/core-2.1.2/Array.html#method-i-uniq
<% @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 %>
你可以尝试这个获得uniq拉丁名字
<% @worlds.collect(&:latin).collect(&:name).uniq.each do |latin_name| %> <%= latin_name %> <% end %>