如何在多个级别的“订单”ActiveRelation调用中包含排序?
也就是说,我理解答案的时候只有一个层次(在Rails order by associated data询问并回答)。但是,我有一个案例,我想要排序的数据是两个层次。
具体来说,在我的模式中,SongbookEntry包含一个录音,其中包含一个艺术家和一首歌曲。我希望能够通过歌曲标题对SongbookEntry列表进行排序。
我可以深入一级并按歌曲标题对录音进行排序:
@recordings = Recording.includes(:song).order('songs.title')
......但不知道如何深入两级。另外,如果我可以对录音(即歌曲名称和艺术家名称)进行排序,这将是很好的 - 这是否可以不进入SQL?
感谢您的帮助,
基思
答案 0 :(得分:0)
我建议将录制品名称(也可能是歌曲标题)存储在录制内容中,这样您就不必“下载到SQL”。
答案 1 :(得分:0)
试试这个 SongbookEntry.includes(:recording => [:artist,:song])。order('songs.title,artists.name')
如果您不想在视图中使用关联的表字段
,则可以使用连接代替包含答案 2 :(得分:0)
如果您对SongbookEntry
和Song
之间的关联进行建模,那么:
class SongbookEntry < ActiveRecord::Base
# ...
has_one :song, through: :recording
end
您可以使用现有架构访问@songbookentry.song
和SongbookEntry.joins(:song)
。
编辑:
对Artist
应用相同的想法,可能的查询是:
SongbookEntry.joins(:song,:artist).order('songs.title','artists.name')
请注意,这可能不是最有效的操作(涉及多个连接),即使它看起来像Rails-ish,所以稍后您可能想要像Ryan建议的那样对表进行非规范化,或者找到另一种方法来建模数据。 / p>