Artists Group_by nested attribute Order_date

2020-08-02 19:14发布

问题:

I have created a functioning e-commerce platform where Members can buy songs. Everything works fine, But I would like to group all of my Orders in my Index Page by Month.

Currently I am able to group each Album with its corresponding Artist, and each Ordered Song to its corresponding Album. But now I would like to group Orders by Month.

How Can I Group Artists by the order_date in my Orders Table, So that everything is organized by Month?

Ex. of what I've like to do 

Month 1 Orders 
Artist1
  Album1                      ###List of Albums Corresponding to an Artist 
    --Song1 (10 0rders)          
    --Song3 (5 Orders)
  Album2 
    --Song5 (2 Orders)        ###Ordered Songs Corresponding to an Album 

Month 2 Orders
Artist2
  Album1 
    --Song2 (1 Order)
Artist3
  Album3 
    --Song5 (1 Order)

MODELS

class Order < ActiveRecord::Base
  attr_accessible :artist_id, :album_id, :song_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

CONTROLLERS

###How Can I Group Artists by the order_date in my Orders Table?

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

VIEWS

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

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

         <% album.songs.each do |song| %>     ###Lists All Ordered Songs corresponding to Albums

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

         <% end %> 


     <% end %>

   <% end %>

回答1:

You get the list of orders ok with this line:

<% @order_months.sort.each do |month, orders| %>

But then you jump back into your full list of artists with this line:

   <% @artists.each do |artist| %>             ###Lists All Artists with Orders

Instead I think you need something like

   <% orders.each do |order| %>
     <% order.artists.each do |artist| %>
       <% artist.albums.each do |album| %> 
         <% album.songs.each do |song| %>
             <%= song.name %>

To get order.artists you will need to modify your model:

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

  belongs_to :song
  belongs_to :user

  has_many :albums, through: :song
  has_many :artists, through: :albums

end


回答2:

This is how I ended up Solving the Problem

Controller

@orders = Order.find(:all, :order => 'order_date, id', :limit => 50)

Views

<% @orders.sort.group_by { |order| order.order_date.beginning_of_month }.each do |month, orders| %>
  <h3><%= month.strftime('%B') %> </h3>

  <% orders.group_by { |order| order.song.album.artist }.each do |artist, orders| %>
    <h4><%= artist.name %> </h4>

    <% orders.group_by { |order| order.song.album }.each do |album, orders| %>
      <h5><%= album.name %> </h5>

        <% orders.group_by { |order| order.song }.each do |song, orders| %>
          <p>(<%= orders.count %>) <%= song.title %> </p>
          <p><%= song.price %> </p>
        <% end %>

    <% end %>

  <% end %>

<% end %>