2011-03-23 18 views
6

Digamos que tiene una disposición ordenada de este tipo, generado a partir de una base de datos de direcciones:bucle a través de una matriz de datos agrupados en Ruby (rieles)

[ 
    { city: Sacramento, state: CA }, 
    { city: San Francisco, state: CA }, 
    { city: Seattle, state: WA } 
] 

y desea generar HTML con él de esta manera:

<p>CA</p> 
<ul> 
    <li>Sacramento</li> 
    <li>San Francisco</li> 
</ul> 
<p>WA</p> 
<ul> 
    <li>Seattle</li> 
</ul> 

Así que estás agrupando por estado. Un enfoque para hacer esto sería recordar la última fila en cada iteración del ciclo y mostrar las etiquetas UL de estado y delimitación solo si el estado de la fila actual es el mismo que el estado de las últimas filas. Eso parece desagradable y no Ruby-y.

¿Alguien tiene algún consejo sobre un enfoque elegante de Ruby/Rails para esto?

Respuesta

8

Enumerable#group_by?

array = [ 
    {city: 'Sacramento', state: 'CA'}, 
    {city: 'San Francisco', state: 'CA'}, 
    {city: 'Seattle', state: 'WA'} 
] 

array.group_by{|elem| elem[:state]} 
# => {"CA"=>[{:city=>"Sacramento", :state=>"CA"}, {:city=>"San Francisco", :state=>"CA"}], "WA"=>[{:city=>"Seattle", :state=>"WA"}]} 
0

Puede utilizar la función group_by en Rails

@records.group_by{|x| x[:state]} 

Esto le devolverá un hash donde la clave es el estado y los valores son una matriz de los registros

This link debería ayudar descubres cómo funciona un poco más.

+0

No se puede utilizar el símbolo # to_proc para hacer referencia a un símbolo de hash llave. ;) – coreyward

+0

@coreyward: Puedes hacerlo si tus elementos son objetos AR, no Hashes. ;) –

+0

@Mladen Jablanović Sí, entonces son métodos, no símbolos claves hash. A falta de las comillas faltantes que delimitan los valores de hash como cadenas, la pregunta muestra una definición de hash Ruby válida. – coreyward

7

Enumerable tiene group_by

cities = [ 
    { city: "Sacramento", state: "CA" }, 
    { city: "San Francisco", state: "CA" }, 
    { city: "Seattle", state: "WA" }] 

cities.group_by {|c| c[:state]} 


=> {"CA"=>[{:city=>"Sacramento", :state=>"CA"}, 
      {:city=>"San Francisco", :state=>"CA"}], 
    "WA"=>[{:city=>"Seattle", :state=>"WA"}]} 

Soy un poco oxidado en ERB, pero creo que sería algo como esto

<% @cities_by_state.each do |state, cities| %> 
<p><%= state %></p> 
<ul> 
    <% cities.each do |city| %> 
    <li><%= city[:city] %></li> 
    <% end %> 
</ul> 
<% end %> 
Cuestiones relacionadas