2011-03-23 63 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 %>