2016-07-12 4 views
0

У меня есть код в представлении:Группировка в Rails

<% @insurer.offices.includes(:city).order('cities.name asc').each do |office| %> 
    <div class="headline"> 
     <h4><%= office.city.name %></h4> 
    </div> 
    <p><%= office.name %></p> 
    <% end %> 

После этого цикла я могу увидеть города и офисы в этих городах, но города повторяются, как:

New York: 
Office address 

New York: 
Other office address 

I необходимо показать все офисы, сгруппированные по городу. Я пытался использовать <% @insurer.offices.includes(:city).group('cities.name').order('cities.name asc').each do |office| %>, но он не работает. Есть ли способ сделать это? Благодарю.

ответ

0

ли это, и это помогло:

<% @all_insurers.each do |city, office| %> 
    <div class="headline"> 
    <h4><%= city.name %></h4> 
    </div> 
    <% office.each do |city_office| %> 
    <%= city_office.name%> 
    <% end %> 
<% end %> 

В моем insurers_controller:

def show 
    @insurer = Insurer.find(params[:id]) 
    @all_insurers = @insurer.offices.includes(:city).order('cities.name asc').group_by(&:city) 
end 
0

Ваша петля предназначена для предоставления вам одного офиса за раз. Даже если города сгруппированы, когда у вас есть 3 офиса в Нью-Йорке, он будет запускать цикл 3 раза.

Чтобы сгруппировать офисы под общим заголовком города, вам необходимо сгруппировать офис по городу, и ваша петля должна запомнить предыдущий город и отобразить заголовок только в том случае, если город изменится.

Добавить переменную как previous_city (это, вероятно, необходимо инициализировать перед циклом с нуля), а также отображать заголовок, только если previous_city == office.city и в конце цикла вы можете сделать previous_city = office.city

Другое дело, @insurer.offices.includes(:city).order('cities.name asc') должны быть в переменной, определенной в контроллере.

Смежные вопросы