如何在一个超过一层深度的“order”ActiveRelation调用中包含排序?
也就是说,当答案只有一级深的时候,我就能理解它(在Rails order by associated data上被问答)。然而,我有一个例子,我想要排序的数据是两层深的。
具体地说,在我的模式中,SongbookEntry包含一段录音,其中包含一位艺术家和一首歌曲。我想能够排序的歌曲标题的SongbookEntry列表。
我可以深入一级,并按歌曲标题对录音进行排序:
@recordings = Recording.includes(:song).order('songs.title')...but不知道如何深入两个层次。此外,如果我可以对录音(即歌曲名称和艺术家姓名)进行排序,那就太好了--这可以在不深入SQL的情况下实现吗?
谢谢你的帮助
基思
发布于 2012-10-29 16:22:13
如果将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一样,因此稍后您可能想要像Ryan建议的那样反规范化这些表,或者找到另一种方法来对数据建模。
发布于 2012-10-29 16:13:17
我建议将艺术家的名字(可能还有歌曲名称)存储在录音本身上,这样你就不必“进入SQL”了。
发布于 2012-10-29 16:22:01
尝尝这个
SongbookEntry.includes(:recording=>:artist,:song).order('songs.title,artists.name')
如果不希望在视图中使用关联表字段,则可以使用连接代替包含
https://stackoverflow.com/questions/13117695
复制相似问题