循环遍历ruby(rails)中的分组数据数组

weo*_*tch 6 ruby ruby-on-rails

假设您有一个这样的有序数组,从地址数据库生成:

[
  { city: Sacramento, state: CA },
  { city: San Francisco, state: CA },
  { city: Seattle, state: WA }
]
Run Code Online (Sandbox Code Playgroud)

你想用它生成HTML,如下所示:

<p>CA</p>
<ul>
    <li>Sacramento</li>
    <li>San Francisco</li>
</ul>
<p>WA</p>
<ul>
    <li>Seattle</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

所以你要按州分组.这样做的一种方法是记住循环的每次迭代的最后一行,并且仅当当前行的状态与最后行状态相同时才显示状态和bookending UL标记.这似乎有点讨厌和非Ruby-y.

有人对优雅的Ruby/Rails方法有任何建议吗?

Mla*_*vić 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"}]} 
Run Code Online (Sandbox Code Playgroud)


Jon*_*röm 8

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"}]}
Run Code Online (Sandbox Code Playgroud)

我在ERB上有点生疏,但我认为会是这样的

<% @cities_by_state.each do |state, cities| %>
<p><%= state %></p>
<ul>
  <% cities.each do |city| %>
    <li><%= city[:city] %></li>
  <% end %>
</ul>
<% end %>
Run Code Online (Sandbox Code Playgroud)