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:不推荐使用内容声明:: order。 请改用示波器块。例如,以下内容:has_many :spam_comments,条件:{spam:true},class_name:'评论' 应改写如下:has_many:spam_comments, - &gt; { 垃圾邮件:true},class_name:'评论' 。 (来自/Users/shivam/Code/auroville/avorg/app/models/related_list.rb:7)
似乎Rails 4有新的:用于模型的命令语法,但我似乎无法在Rails指南中找到文档。
答案 0 :(得分:238)
在Rails 4中,:order
已被弃用,需要替换为lambda范围块,如您在问题中发布的警告所示。另一点需要注意的是,此范围块需要在任何其他关联选项之前传递,例如dependent: :destroy
等。
尝试一下:
has_many :contents, -> { order(:position) }
要指定订单方向,即@ joshua-coady和@wsprujit建议的asc
或desc
,请使用:
has_many :contents, -> { order 'position desc' }
或者,使用散列样式:
has_many :contents, -> { order(position: :desc) }
关于Active Record Scopes for has_many
的进一步参考。
答案 1 :(得分:33)
我花了一些时间来弄清楚如何做订单和包含,我最终发现你chain the scope陈述,
has_many :things, -> { includes(:stuff).order("somedate desc") }, class_name: "SomeThing"
答案 2 :(得分:20)
我想补充一点,如果你有任何选项哈希参数,他们必须追踪lambda,就像这样:
has_many :things, -> { order :stuff }, dependent: :destroy
我花了一分钟时间自己解决这个问题 - 希望它可以帮助其他人来解决这个问题。
答案 3 :(得分:0)
这对我适用于Rails 4和 MongoDB
has_many :discounts, order: :min_amount.asc
答案 4 :(得分:-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, -> {}
。