Rails 4已弃用警告has_many with order

时间:2013-08-17 02:45:02

标签: ruby-on-rails ruby-on-rails-4

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指南中找到文档。

5 个答案:

答案 0 :(得分:238)

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

尝试一下:

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

要指定订单方向,即@ joshua-coady和@wsprujit建议的ascdesc,请使用:

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, -> {}