Rails 4 has_many的不建议使用命令


105
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,条件:{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指南中的文档。

Answers:


250

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

试试看:

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

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

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

或者,使用哈希样式:

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

有关Active Record范围的has_many进一步参考。


3
作品精湛!我在指南或文档中哪里可以找到此类信息?我找不到一个。谢谢。
shankardevy


4
如果您有多个不建议使用的选项,例如oderinclude怎么办?这:{ order(:position), include(:track) }在逗号上引发错误。
kakubei

2
要订购asc / desc,请使用-> { order(name: :asc) }
wspruijt 2014年

1
如果由于某种原因,您只想对集合进行某些排序,那么您也可以这样做list.contents.order('position desc'),整体上可以提高效率,而不是像模型侵入式那样(在投票的答案中,列表知道一个内容字段,在此控制器知道它的内容) )
肮脏的亨利

35

我花了一段时间才弄清楚如何进行排序和包含,最终发现您将作用域语句链接起来,

has_many :things, -> { includes(:stuff).order("somedate desc") }, class_name: "SomeThing"

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

27

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

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

花了我一点时间自己弄清楚-希望它可以帮助其他遇到相同问题的人。


3
对于对象上可能存在的“通过”关联也是如此has_many :items, -> { order 'name' }, through: :suppliers
Major Major

0

这对我适用于Rails 4和MongoDB

has_many :discounts, order: :min_amount.asc

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


4
不要使用默认范围。如果您习惯这样做,则可以在该魔术方法中添加更多逻辑。将来很难覆盖它。
2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.