首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails Order by Contained Objects 2 Levels?

Rails Order by Contained Objects 2 Levels?
EN

Stack Overflow用户
提问于 2012-10-29 15:48:01
回答 3查看 372关注 0票数 0

如何在一个超过一层深度的“order”ActiveRelation调用中包含排序?

也就是说,当答案只有一级深的时候,我就能理解它(在Rails order by associated data上被问答)。然而,我有一个例子,我想要排序的数据是两层深的。

具体地说,在我的模式中,SongbookEntry包含一段录音,其中包含一位艺术家和一首歌曲。我想能够排序的歌曲标题的SongbookEntry列表。

我可以深入一级,并按歌曲标题对录音进行排序:

代码语言:javascript
复制
@recordings = Recording.includes(:song).order('songs.title')

...but不知道如何深入两个层次。此外,如果我可以对录音(即歌曲名称和艺术家姓名)进行排序,那就太好了--这可以在不深入SQL的情况下实现吗?

谢谢你的帮助

基思

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-29 16:22:13

如果将SongbookEntrySong之间的关联建模为:

代码语言:javascript
复制
class SongbookEntry < ActiveRecord::Base
  # ...
  has_one :song, through: :recording
end

您将能够使用现有架构访问@songbookentry.songSongbookEntry.joins(:song)

编辑:

将同样的想法应用于Artist,一个可能的查询是:

代码语言:javascript
复制
SongbookEntry.joins(:song,:artist).order('songs.title','artists.name')

请注意,这可能不是最有效的操作(涉及多个连接),尽管它看起来像Rails一样,因此稍后您可能想要像Ryan建议的那样反规范化这些表,或者找到另一种方法来对数据建模。

票数 0
EN

Stack Overflow用户

发布于 2012-10-29 16:13:17

我建议将艺术家的名字(可能还有歌曲名称)存储在录音本身上,这样你就不必“进入SQL”了。

票数 0
EN

Stack Overflow用户

发布于 2012-10-29 16:22:01

尝尝这个

  SongbookEntry.includes(:recording=>:artist,:song).order('songs.title,artists.name')

如果不希望在视图中使用关联表字段,则可以使用连接代替包含

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13117695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档