2011-02-12 40 views
8

我有以下几点:rails - 使用Group_by时 - 如何获取索引?

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 %> 

也就是说然后破裂,出现错误:未定义的方法`最后的” 0:Fixnum对象

想法?谢谢

回答

13

您观察到的问题是由于参数分配给块的方式。在第二个示例中,您将观察到range包含一个包含单个range和匹配datas的数组,datas变量包含该索引,并且i始终为nil

这是因为ruby“unsplats”数组,如果它是该块的唯一参数。如果你有多个类型(在这个例子中是一个数组和一个整数),你必须提示它应该做什么。最简单的方法是使用圆括号。

<% sets.each_with_index do |(range, datas), i| %> 
    ... 
<% end %> 

这样一来,红宝石会知道你的意思,阵列最多分成rangedatas。这实际上是ruby的赋值操作符和逗号操作符的一个特性。它的工作原理是这样的

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

感谢Holger,我第一次碰到这种情况。 – AnApprentice 2011-02-12 23:26:40