2011-03-23 100 views
6

假設你有一個有序陣列像這樣,從地址數據庫中生成:遍歷分組數據的紅寶石陣列(導軌)

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

而你要這樣用它來生成HTML:

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

所以你按照狀態分組。做這件事的一種方法是記住循環的每次迭代中的最後一行,並且僅噹噹前行的狀態與最後一行狀態相同時才顯示狀態並阻止UL標記。這似乎是一種討厭和非Ruby-y。

任何人有任何關於這個優雅的Ruby/Rails方法的意見?

回答

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

您可以使用Rails中的GROUP_BY功能

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

這將返回一個散列結果,其中的關鍵是狀態和值的記錄數組

This link應該幫助你弄清楚它是如何工作的。

+0

不能使用符號#to_proc引用一個符號散鍵。 ;) – coreyward 2011-03-23 21:36:10

+0

@coreyward:你可以,如果你的元素是AR對象,而不是哈希。 ;) – 2011-03-23 21:38:20

+0

@MladenJablanović是的,那麼他們是方法,而不是符號散列鍵。缺少將引號分隔爲散列值的缺失引號,問題顯示了一個有效的Ruby散列定義。 – coreyward 2011-03-23 21:40:19

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

我是那種對僱員再培訓局的生疏,但我認爲這將是這樣的

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