2011-02-12 37 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