Проход по массиву сгруппированных данных в ruby ​​(rails) - PullRequest
6 голосов
/ 24 марта 2011

Скажем, у вас есть такой упорядоченный массив, сгенерированный из базы данных адресов:

[
  { 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 к этому?

Ответы [ 3 ]

8 голосов
/ 24 марта 2011

Перечислимый имеет 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"}]}

Я немного заржавел на ERB, но думаю, что-то вроде этого

<% @cities_by_state.each do |state, cities| %>
<p><%= state %></p>
<ul>
  <% cities.each do |city| %>
    <li><%= city[:city] %></li>
  <% end %>
</ul>
<% end %>
8 голосов
/ 24 марта 2011

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 голосов
/ 24 марта 2011

Вы можете использовать функцию group_by в Rails

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

Это вернет вам хэш, где ключ - это состояние, а значения - это массив записей

Эта ссылка должна помочь вам понять, как она работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...