Rails - 在使用Group_by时,如何获得索引?

10

我有以下内容:

sets = DataSet.all.group_by{ |data| [data.project_id, "-", data.thread_id].join(" ") }

<% sets.each do |range, datas| %>
  <p><%= range %>:</p>
  <% datas.each do |data| %>
     <%=data%>
    <p>Last Post<%= data.last.created_at %></p>
  <% end %>
<% end %>

问题是我需要一个索引。因此,我更新了上面的内容:

<% sets.each_with_index do |range, datas, i| %>
  <p><%= range %>:</p>
  <% datas.each do |data| %>
     <%= i %>
     <%=data%>
    <p>Last Post<%= data.last.created_at %></p>
  <% end %>
<% end %>

这会导致错误:undefined method `last' for 0:Fixnum

有什么想法吗?谢谢

1个回答

18
你看到的问题是由参数分配到块中的方式引起的。在你的第二个例子中,你会发现range包含一个包含单个range和匹配的datas的数组,datas变量包含索引,而i始终为nil

这是因为如果数组是传递给块的唯一参数,Ruby会自动展开它。如果你有不止一种类型(在这种情况下是数组和整数),你必须提示Ruby它应该怎么做。最简单的方法是使用括号。
<% sets.each_with_index do |(range, datas), i| %>
  ...
<% end %>

这样,Ruby就会知道您的意思,并将数组分割成rangedatas。 实际上,这是Ruby赋值运算符与逗号运算符相结合的一个特性。它的工作方式如下:

my_array = [1, 2]
(x, y) = my_array
p x                # prints 1
p y                # prints 2

谢谢Holger,这是我第一次遇到这种情况。 - AnApprentice

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接