2011-02-12 10 views
8

Tengo el siguiente:rieles: al usar Group_by - ¿Cómo obtener un índice?

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

problema es que necesito un índice. Así que al día el anterior con:

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

Que luego se rompe, con el error: método no definido `última' de 0: Fixnum

ideas? gracias

Respuesta

13

El problema que observa es la forma en que se asignan los parámetros al bloque. En su segundo ejemplo, observará que range contiene una matriz que contiene un solo range y la correspondiente datas, la variable datas contiene el índice y i es siempre nil.

Esto se debe a que las matrices de rubíes "no reventan" si es el único parámetro del bloque. Si tiene más de un tipo (en este caso, una matriz y un número entero), debe indicar ruby ​​sobre lo que debería hacer. La forma más simple es usar paréntesis.

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

De esta manera, el rubí sabrá lo que quiere decir y dividir la matriz de arriba hacia range y datas. Esta es en realidad una característica del operador de asignación de ruby ​​junto con el operador de coma. Funciona así

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

Gracias Holger, la primera vez que he visto este escenario. – AnApprentice

Cuestiones relacionadas