2012-10-29 31 views
0

我如何在'順序'包含ActiveRelation調用中包含多個級別的訂購?通過包含對象的軌道順序2級深?

也就是說,我理解答案的時候只有一個級別(問及在Rails order by associated data回答)。但是,我有一個情況,我想要對其進行排序的數據是兩個深度的數據。

具體來說,在我的模式中,一個SongbookEntry包含一個Recording,其中包含一個Artist和一首歌曲。我希望能夠按歌曲標題對SongbookEntry列表進行排序。

我可以去一個層次深,並通過歌曲名稱排序錄音:

@recordings = Recording.includes(:song).order('songs.title') 

...但不知道如何深入兩個層次。另外,如果我可以對錄音進行排序(即歌曲名稱和藝術家姓名),這將是非常棒的 - 這可能不會下降到SQL?

感謝您的幫助,

基思

回答

0

如果模型SongbookEntrySong之間的關聯如此:

class SongbookEntry < ActiveRecord::Base 
    # ... 
    has_one :song, through: :recording 
end 

,你將能夠使用您現有的模式訪問@songbookentry.songSongbookEntry.joins(:song)

編輯:

申請Artist同樣的想法,一個可能的查詢是:

SongbookEntry.joins(:song,:artist).order('songs.title','artists.name') 

注意,這可能不是最有效的操作(多次join參與),即使它看起來的Rails -ish,所以稍後你可能想按照Ryan的建議對錶格進行非規範化處理,或者找到另一種模型化數據的方法。

0

我會建議在記錄本身存儲的藝術家名(也可能是歌名太),所以你不必「陷入SQL」 。

0

試試這個
    SongbookEntry.includes(:記錄=> [:藝術家:歌曲])。爲了( 'songs.title,artists.name')

您可以使用連接代替包括,如果你不想使用相關的表中字段的意見