2011-09-06 87 views
1

我正在構建一個音樂管理Rails應用程序,我的應用程序的用戶將能夠製作專輯的有序播放列表,並且每個專輯都會有一個有序的歌曲列表。如何使用ActiveRecord對深層嵌套集合進行排序?

在本質上,這將是這樣的:

class User < ActiveRecord::Base 
    has_many :playlists, :order => "position" 
    has_many :albums, :through => :playlists 
end 

class Playlist < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :album 
end 

class Album < ActiveRecord::Base 
    has_many :songs, :order => "position" 
    has_many :playlists 
end 

class Song < ActiveRecord::Base 
    belongs_to :album 
end 

(我使用acts_as_list使用的歌曲和播放列表表一position列來管理歌曲和播放列表的排序順序,分別。)

現在我想查找給定用戶的所有歌曲(按順序)的列表。如果我這個範圍內添加到型號:

scope :for_user, lambda{|user| 
    joins(:album => {:playlists => :user}). 
    where(:'users.id' => user.id) 
} 

我可以做到這一點,但返回的記錄沒有保持秩序。相反,我希望看到每首歌曲首先按專輯的播放列表位置排序,然後按該歌曲在該專輯中的位置排序。換句話說,如果用戶想按順序播放專輯A,B和C,我正在查找來自A的所有歌曲(按照他們在專輯中的順序)以及來自B的所有歌曲(按順序),加上C中的所有歌曲(按順序)。

我試過的爲了條款的範圍若干排列,但沒有已訂購專輯的範圍內訂購歌曲的預期效果。

回答

0

時要添加到m_x的答案,如果你希望你的代碼將被更多的面向對象是唯一有用的,你可以建立訂單條款是這樣的:

order(Album.arel_table[:position], Song.arel_table[:position])

相關問題