Rails将.each值的集合转换为Array-type

时间:2014-08-02 00:54:06

标签: ruby-on-rails arrays

我正在使用.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]

4 个答案:

答案 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!