嵌套循环通过一个模型

时间:2015-02-16 22:38:44

标签: ruby-on-rails-4

在我的音乐评论应用中,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 %> 

我知道上面的嵌套表格不起作用,但这是我想要弄清楚的要点。

上面的嵌套代码为我提供了一个&#34;未定义的方法&#39;每个&#39;&#34;在pin.artist.each行上。

2 个答案:

答案 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 移动了局部变量的范围

答案 1 :(得分: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 || = nil,然后在每个循环结束时设置last_artist = pin.artist。