我正在使用.each方法查找类型列表
<% @mg_relationships.each do |mg_relationship| %>
<% @genre = Genre.find(mg_relationship.genre_id) %>
<%= @genre.id %>
<% end %>
此代码返回以下内容
35 14 10595 10751 35 28 12 14 878 35
我需要做的是,在每次调用之外,将上面的输出转换为类似于数组的格式,例如@array
,如下:
[35, 14, 10595, 10751, 35, 28, 12, 14, 878, 35]
这样我就可以使用&lt;%= @ array.uniq了! %GT;过滤如何类似的值并返回
[35, 14, 10595, 10751, 28, 12, 878]
答案 0 :(得分:1)
您不需要查询Genre
模型,您已经拥有genre_id
。只需在模型或关联上使用pluck
:
MgRelationship.pluck(:genre_id)
如果您需要结果是唯一的,可以将.uniq
应用于范围以生成select distinct
:
MgRelationship.uniq.pluck(:genre_id)
答案 1 :(得分:0)
试试这个:
<%= Genre.where(id: @mg_relationships.pluck(&:genre_id)).map(&:id) %>
答案 2 :(得分:0)
Meagar的回答非常好,但我想提供另一种方式。
Genre.where('exists (select 1 from Mg_Relationships
where Mg_Relationships.genre_id = genres.id)').pluck(:id)
它与MgRelationship.uniq.pluck(:genre_id)
具有相同的效果,但是当MgRelationships数据包含某些类型。在类型中不存在时,您可以同时删除它们。
修改强>
我回顾了你的问题,意识到我们可能都会误解你。
你说你想要outside of the each call, to get @arrary
。我想你只想要一次获取DBMS,将两种内容填充到视图中。
如果我猜是这样,试试这个:
<% genre_ids = []%>
<% @mg_relationships.each do |mg_relationship| %>
<% @genre = Genre.find(mg_relationship.genre_id) %>
<%#= @genre.id %>
<% genre_ids << @genre.id %>
<% end %>
<% = genre_ids %>
<% = genre_ids.uniq %>
在veiws中,您可以使用<% %>
代替<% = ...%>
但我们必须说你的原始代码在效率方面存在很大问题,这就是为什么所有答案都建议你改为映射或拔除。
如果你有10 mg_relationships,你的原始代码将生成11个sql语句来执行。所有建议你的答案是只生成一个sql语句来做同样的事情。
希望您能理解我们的建议,并改进您的代码。
答案 3 :(得分:0)
上面的一些答案可以做到,但是因为你已经拥有@mg_relationships
变量,你想要的只是简单:
@mg_relationships.map{|mg| mg.genre_id}.uniq!