ruby-on-rails - rails : Order model object by attribute of referenced model object

标签 ruby-on-rails ruby sorting activerecord

考虑拥有一个模型“专辑”和一个模型“艺术家”。专辑引用了一位艺术家。

我想要获取所有专辑的数组,按专辑艺术家姓名和专辑发行年份排序。

在普通 SQL 中,它看起来像这样:

SELECT a1.name,a1.release_year,a2.name from albums a1 INNER JOIN artists a2 ON a1.artist_id=a2.id ORDER BY a2.name ASC, a1.release_year;

我是 ruby​​ 和 Rails 的新手,无法找到使用 Rails 方法执行此操作的解决方案。我知道模型对象的 order 方法,并成功使用它按属性对对象进行排序。

但是,我不知道如何不仅按模型本身的属性进行排序,而且还按引用模型的属性(在本例中:“艺术家”的名称)进行排序。

感谢您的回答。

最佳答案

试试这个:

Album.joins(:artist).order('artists.name ASC, release_year')

或者:

Album.joins(:artist).order('artists.name ASC, albums.release_year')

或者:

Album.joins(:artist).order("#{Artist.table_name}.name ASC, #{Album.table_name}.release_year")

也许您可以创建一个范围,以便在您的Album模型类中更轻松地访问此调用:

scope :artist_with_release_year, -> { joins(:artist).order("#{Artist.table_name}.name ASC, #{Album.table_name}.release_year") }

您可以稍后在应用程序中调用:

Album.artist_with_release_year

关于ruby-on-rails - rails : Order model object by attribute of referenced model object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26314831/

相关文章:

ruby-on-rails - Rails 3.1、回形针、s3 - 未初始化的常量 AWS::S3::Base

ruby-on-rails - 来自 sidekiq 的 Action Cable Broadcast 消息仅在刷新后显示,从控制台立即生效

Javascript:对多维数组进行排序

Swift - 使用多个条件对对象数组进行排序

ruby-on-rails - 设计路线不起作用

ruby-on-rails - rails jbuilder - 只是一个字符串数组

ruby - 为什么我不能用 gsub 替换字符串中的 '\\+'?

python - 匹配除表情符号之外的所有符号

ruby - 使用 "debugger"gem 在 Emacs 中调试 Ruby 1.9

sorting - JsGrid - 刷新时保持排序顺序