如何覆盖:在 has_many 中定义的顺序

Posted

技术标签:

【中文标题】如何覆盖:在 has_many 中定义的顺序【英文标题】:How to override :order defined in a has_many 【发布时间】:2011-05-11 06:25:03 【问题描述】:

我有

class Authors 
has_many :books, :order => 'name ASC'

我正在尝试查询所有按名称 DESC 排序的书籍

Authors.books.order('name DESC')

但结果是

SELECT * FROM .... ORDER BY name ASC, name DESC

结果以 ASC 排序的名称返回

有没有办法删除关联中的原始顺序或覆盖它?还是在关系中指定顺序是个坏主意?

使用 Rails 3.0.3

【问题讨论】:

【参考方案1】:

使用reorder:

Authors.books.reorder('name DESC')

【讨论】:

太好了!但是在任何地方都找不到它的记录;你在哪里找到的? 其实这还有效吗? github.com/rails/rails/commit/… @Christopher ~ 不是我的阅读。我可以建议(您可能已经从该帖子中推断出)接受@Jon 在下面的回答吗? 也适用于 Rails 5:api.rubyonrails.org/classes/ActiveRecord/…【参考方案2】:

.reorder() 在 Rails 3.0.3 中已弃用,取而代之的是 .except(:order).order()

所以用这个:

Authors.books.except(:order).order('name DESC')

【讨论】:

我在 rails 3.1.0.rc4 上没有看到任何关于#reorder 的弃用警告,.except(:order).order() 不排除从关联中引入的 order 子句。 .except(:order).order() 确实排除在关联上定义的顺序子句。 我没有看到任何提及 reorder 在 Rails 3.2.8 中被弃用:apidock.com/rails/v3.2.8/ActiveRecord/QueryMethods/reorder reorder 在 Rails 4.0.2 中仍然有效:apidock.com/rails/v4.0.2/ActiveRecord/QueryMethods/reorder【参考方案3】:
Author.first.books.reverse_order

【讨论】:

以上是关于如何覆盖:在 has_many 中定义的顺序的主要内容,如果未能解决你的问题,请参考以下文章

如何通过关联为 has_many 定义工厂

如何通过rails中的关联定义has_many

如何在 Ruby on Rails 中通过关联订购 has_many?

Ecto - 如何通过特定查询获取“has_many”

如何通过关联在 has_many 中使用回调?

如何在同一模型中进行 has_many 和 has_one 关联?