艺术家和歌曲的列表和组排序

时间:2014-05-24 05:52:35

标签: ruby ruby-on-rails-3 sorting include nested-loops

我创建了一个运作良好的电子商务平台,会员可以在这里购买歌曲。一切正常,但我想在艺术家的索引页面中对我的所有订单进行分组。

目前,我可以将每位作者与其相应的专辑分组,但每张专辑下的每首有序歌曲都会被列出多次。

如何列出与专辑相对应的所有订购歌曲而不重复歌曲标题并提供显示总订单的计数器?

EX. of what I'd like in my Orders Page

###Orders grouped by Artists (which I've Done)
Artist1
  Album1                      ###List of Albums Corresponding to an Artist 
    --Song1 (10 0rders)          (which I've Done)
    --Song3 (5 Orders)
  Album2 
    --Song5 (2 Orders)        ###Ordered Songs Corresponding to an Album (NEED HELP)
  Album3                      ###No Duplicates, only list ordered songs with a counter 

Artist2
  Album1 
    --Song2 (1 Orders)
  Album2 

Artist3
  Album1 
    --Song4 (1 Orders)

模型

class Order < ActiveRecord::Base
  attr_accessible :artist_id, :album_id, :user_id, :order_date

  belongs_to :song
  belongs_to :user

end

class Artist < ActiveRecord::Base
  attr_accessible :name

  has_many :albums
  has_many :songs, :through => :albums
  has_many :orders, :through => :songs

end

class Album < ActiveRecord::Base
  attr_accessible :name, :artist_id

  belongs_to :artist
  has_many :songs
  has_many :orders, :through => :songs

end

class Song < ActiveRecord::Base
  attr_accessible :artist_id, :album_id, :title, :price

  belongs_to :album
  has_many :orders

end

控制器

def index    
  @artists = Artist.includes(:orders).where('orders.id IS NOT NULL')    
end

视图

<% @artists.each do |artist| %>   ###Lists All Artista with Orders
  <h3><%= artist.name %></h3>

  <% artist.albums.each do |album| %>   ###Lists all Albums Corresponding to Artist
      <h4><%= album.name %></h4>

     <% album.orders.each do |order| %> ###Lists All Ordered Song Titles & Price
       <%= order.song.title %><br>      ###How can i list each ordered song with a counter
       <%= order.song.price %><br>
     <% end %>

  <% end %>

<% end %>

2 个答案:

答案 0 :(得分:1)

这是未经测试的,但可能值得尝试......

使用group_by创建album.orders的数组,并按song.title分组。循环遍历哈希。输出每个哈希的第一个元素的标题和价格。计算哈希中的数组元素以获得此歌曲的计数器。

<% orders_hash = album.orders.group_by{|o|o.song.title} %>

<% orders_hash.each do |order_array| %>
  <%= order_array[0].song.title %>
  <%= order_array[0].song.price %>
  <%= order_array.count %>
<% end %>

答案 1 :(得分:0)

这是我提出的解决方案

   <% @artists.each do |artist| %>
     <h3><%= artist.name %></h3>

     <% artist.albums.each do |album| %>
       <h4><%= album.name %></h4>

         <% album.songs.each do |song| %>

           <% if song.orders.count >= 1 %>
             (<%= song.orders.count %>)
             <%= song.title %>
             $<%= song.price %><br>
           <% end %>

         <% end %> 


     <% end %>

   <% end %>