110
class RelatedList < ActiveRecord::Base
  extend Enumerize

  enumerize :list_type, in: %w(groups projects)

  belongs_to :content
  has_many :contents, :order => :position

end

我在我的 rails 应用程序中有这个模型,当我尝试在控制台中创建记录时会引发警告。

弃用警告:RelatedList.has_many :contents 声明中的以下选项已弃用::order。请改用范围块。例如,以下内容:has_many :spam_comments, conditions: { spam: true }, class_name: 'Comment' 应改写为: has_many :spam_comments, -> { where spam: true }, class_name: 'Comment' 。(从 /Users/shivam/Code/auroville/avorg/app/models/related_list.rb:7 调用)

似乎 Rails 4 有新的 :order 语法用于模型,但我似乎无法在 Rails Guides 中找到文档。

4

5 回答 5

256

在 Rails 4 中,:order已弃用,需要替换为 lambda 范围块,如您在问题中发布的警告所示。需要注意的另一点是,此范围块需要在任何其他关联选项(例如dependent: :destroy 等)之前传递。

试试这个:

has_many :contents, -> { order(:position) } # Order by :asc by default

要指定订单方向,即asc或者desc按照@joshua-coady 和@wsprujit 的建议,请使用:

has_many :contents, -> { order 'position desc' }

或者,使用哈希样式:

has_many :contents, -> { order(position: :desc) }

有关. _has_many

于 2013-08-17T02:50:49.550 回答
38

我花了一段时间才弄清楚如何进行排序和包含,我最终发现你链接了范围声明,

has_many :things, -> { includes(:stuff).order("somedate desc") }, class_name: "SomeThing"
于 2014-05-29T01:06:32.823 回答
31

只是想我会补充一点,如果您有任何选项哈希参数,它们必须在 lambda 之后,如下所示:

has_many :things, -> { order :stuff }, dependent: :destroy

我自己花了一点时间来解决这个问题 - 希望它可以帮助其他遇到同样问题的人。

于 2016-08-03T18:29:33.433 回答
0

这适用于 Rails 4 和MongoDB

has_many :discounts, order: :min_amount.asc
于 2018-09-11T15:02:18.383 回答
-4

或者,您可以将order子句放在模型上,例如:

has_many :options, order: 'name' # In class Answer

变成

has_many :options # In class Answer

default_scope { order 'name' } # In class Option

PS:我ArgumentError: wrong number of arguments (1 for 0)在做的时候得到has_many :things, -> {}

于 2014-06-27T22:26:37.773 回答