Rails 4已弃用警告has_many with order

sha*_*evy 105 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
Run Code Online (Sandbox Code Playgroud)

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

DEPRECATION警告:不推荐使用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有新的:用于模型的命令语法,但我似乎无法在Rails指南中找到文档.

vee*_*vee 246

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

尝试一下:

has_many :contents, -> { order(:position) }
Run Code Online (Sandbox Code Playgroud)

要指定顺序方向,即无论是ascdesc作为@约书亚-科迪和@wsprujit建议,使用:

has_many :contents, -> { order 'position desc' }
Run Code Online (Sandbox Code Playgroud)

或者,使用哈希样式:

has_many :contents, -> { order(position: :desc) }
Run Code Online (Sandbox Code Playgroud)

有关活动记录范围的has_many进一步参考.

  • 如果你有多个弃用的选项,比如说"oder"和"include"怎么办?这个:`{order(:position),include(:track)}`在逗号上抛出错误. (4认同)
  • 工作精湛!我在哪里可以在指南或文档中找到这些信息?我找不到一个.谢谢. (3认同)
  • 要订购asc/desc,请使用` - > {order(name :: asc)}` (2认同)

小智 35

我花了一段时间来弄清楚如何做订单和包含,我最终发现你链接范围语句,

has_many :things, -> { includes(:stuff).order("somedate desc") }, class_name: "SomeThing"
Run Code Online (Sandbox Code Playgroud)

  • 这正是我的问题。试图找出如何通过父属性来订购has_many关系。没意识到您可以这样做,然后订购。谢谢! (2认同)

Wyl*_*udd 22

只是想我添加,如果你有任何选项哈希参数,他们必须追逐lambda,像这样:

has_many :things, -> { order :stuff }, dependent: :destroy
Run Code Online (Sandbox Code Playgroud)

我花了一分钟时间自己解决这个问题 - 希望它可以帮助其他人来解决这个问题.

  • 对于可能存在于对象上的"通过"关联也是如此 - "has_many:items, - > {order'name'},通过:: supplier` (3认同)