我创建了一个运作良好的电子商务平台,会员可以在这里购买歌曲。一切正常,但我想在艺术家的索引页面中对我的所有订单进行分组。
目前,我可以将每位作者与其相应的专辑分组,但每张专辑下的每首有序歌曲都会被列出多次。
如何列出与专辑相对应的所有订购歌曲而不重复歌曲标题并提供显示总订单的计数器?
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 %>
答案 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 %>