2015-02-16 3 views
2

В моем приложении для просмотра музыки модель Pins имеет атрибуты Pin.artist и Pin.album. Я пытаюсь перечислить каждого художника, просмотренного на сайте, и какие альбомы их были просмотрены. Ниже приводится то, что у меня есть до сих пор, но я хочу сделать это, не повторяя имени исполнителя.Вложенные петли через одну модель

Контроллер:

@pin_albums = Pin.group(:album).order('artist') 

Вид:

<% @pin_albums.each do |pin| %> 
    <%= pin.artist %> | 
    <%= link_to pin.album, copy_pin_path(pin) %> 
    <br/> 
<% end %> 

Это перечисляет их следующим образом:

The Beatles | Let It Be 
The Beatles | Abbey Road 
Bob Dylan | Blood On The Tracks 
Bob Dylan | Highway 61 Revisited 

Я хочу, чтобы перечислить их следующим образом:

The Beatles | Let It Be 
      | Abbey Road 
Bob Dylan | Blood On The Tracks 
      | Highway 61 Revisited 

мне нужно сделать что-то эффект:

<% @pin_albums.each do |pin| %> 
    <ul> 
    <li><%= pin.artist %></li> 
     <ul> 
     <% pin.artist.each do |pin_album| %> 
     <li><%= link_to pin_album.album, pin_album %></li> 
     <% end %> 
    <br/> 
<% end %> 

Я знаю, что вышеуказанные вложенные таблицы не будет работать, но это суть того, что я пытаюсь выяснить.

Вышеупомянутый вложенный код дает мне «неопределенный метод» каждый »на строке pin.artist.each.

+0

Почему вы не опубликовали работу? Вы получили сообщение об ошибке? Вы не задаете вопрос. – ptd

+0

Извините, мой вопрос был ясен в моей голове, но в тексте не так ясен. Я добавил ошибку выше. Я не ожидал, что моя вложенная таблица будет работать, но это лучший способ показать, где мое мышление. –

ответ

1

Вы можете сохранить pin.artist в локальной переменной и распечатать его только после его изменения.

<% last_artist = nil %> 
    <% @pin_albums.each do |pin| %> 
     <%= last_artist != pin.artist ? (last_artist = pin.artist) : '' %> | 
     <%= link_to pin.album, copy_pin_path(pin) %> 
     <br/> 
    <% end %> 

EDIT Переехал объем локальной переменной

+0

Это выводит то же самое, что и мой исходный код, причем каждый художник указан рядом с названием альбома. В этом коде приложение знает, что означает last_artist с точки зрения этого цикла .each do? –

+0

Я удивлен, что это не сработает. last_artist сравнивается с pin.artist ... если он не равен last_artist, устанавливается равным pin.artist и выводится. Если оно равно, то выводится пустая строка. – SteveTurczyn

+0

«last_artist || = nil» - это просто определить его в первый раз. – SteveTurczyn

0

Вот что я в конечном итоге делает для достижения этой цели. (Я положил его в таблицу для целей моделирования)

<% last_artist ||= nil %> 
    <table id="artist"> 
    <tr> 
     <th>Artist</th> 
     <th></th> 
     <th>Album</th> 
    </tr> 
<% @pin_albums.each do |pin| %> 
    <% if last_artist != pin.artist %> 
    <tr> 
     <td><%= pin.artist %></td> 
     <td><%= link_to image_tag(pin.image), pin %></td> 
     <td><%= link_to pin.album, copy_pin_path(pin) %></td> 
    </tr> 
    <% else %> 
    <tr> 
     <td></td> 
     <td><%= link_to image_tag(pin.image), pin %></td> 
     <td><%= link_to pin.album, copy_pin_path(pin) %></td> 
    </tr> 
    <% end %>  
    <% last_artist = pin.artist %>  
<% end %> 

Я установил локальную переменную last_artist || = ноль, чтобы начать, основываясь на предложении Стива выше, а затем установить last_artist = pin.artist в конец каждого цикла.

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