2011-03-23 20 views
6

Eğer bir adres veritabanından oluşturulan böyle sıralı bir dizi olduğunu varsayalım:Döngü (raylar)

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

Ve böyle onunla HTML oluşturmak istiyorum:

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

Yani, duruma göre gruplanıyorsunuz. Bunu yapmanın bir yaklaşımı, döngünün her yinelemesindeki son satırı hatırlamak ve mevcut satırın durumu son satır durumuyla aynıysa, durumu ve UL etiketlerini kitaplamaktır. Bu çirkin ve Ruby olmayan bir şey gibi görünüyor.

Bunun için zarif bir Ruby/Rails yaklaşımı hakkında herhangi bir tavsiye var mı?

cevap

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

Sen Rails group_by işlevini kullanabilirsiniz

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

Bu, anahtar rolü bir karma dönecek ve

This link yardımcı olmalıdır değerler kayıtların dizisidir Nasıl çalıştığını biraz daha anlıyorsun.

+0

gibi bir şey olacağını düşünüyorum tuşuna basın. ;) – coreyward

+0

@coreyward: Öğeleriniz karma nesneleri değil, karma nesneleri olabilir. ;) –

+0

@Mladen Jablanović Evet, o zaman bunlar sembol karma anahtarları değil, yöntemlerdir. Kesin tırnak işaretlerini dizge olarak sınırlayan eksik tırnak işaretlerinden kısaca, soru geçerli bir Ruby hash tanımını gösterir. – coreyward

7

Enumerablegroup_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"}]} 

ben tür ERB üzerinde paslı olduğum vardır ama bir sembol karma başvurmak için Sembol # to_proc kullanamazsınız Bu

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