【问题标题】:Deprecated warning for Rails 4 has_many with orderRails 4 has_many 的已弃用警告与订单
【发布时间】:2013-08-19 12:38:18
【问题描述】:
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_cmets, 条件: { spam: true }, class_name: 'Comment' 应该改写如下: has_many :spam_cmets, -> { 其中 spam: true }, class_name: 'Comment' . (从 /Users/shivam/Code/auroville/avorg/app/models/related_list.rb:7 调用)

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

【问题讨论】:

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


    【解决方案1】:

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

    试试这个:

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

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

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

    或者,使用哈希样式:

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

    更多参考Active Record Scopes for has_many

    【讨论】:

    • 效果很好!我在哪里可以在指南或文档中找到此类信息?我找不到一个。谢谢。
    • 如果您有多个不推荐使用的选项,比如oderinclude,该怎么办?这:{ order(:position), include(:track) } 在逗号上抛出错误。
    • 要订购 asc/desc,请使用-&gt; { order(name: :asc) }
    • 如果出于某种原因,您只想多次订购该系列,您也可以使用list.contents.order('position desc'),这可以提高整体效率,而不是作为模型侵入(在投票的答案中,列出知道一个内容字段,这里控制器知道)
    【解决方案2】:

    我花了一段时间才弄清楚如何进行排序和包含,我最终发现你chain the scope语句,

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

    【讨论】:

    • 这正是我的问题。试图弄清楚如何通过父属性对 has_many 关系进行排序。没有意识到你可以做这样的包括然后订购。谢谢!
    【解决方案3】:

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

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

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

    【讨论】:

    • 对象上可能存在的“通过”关联也是如此 - has_many :items, -&gt; { order 'name' }, through: :suppliers
    • 谢谢,我也只是用依赖选项搜索!! THX
    【解决方案4】:

    这适用于 Rails 4 和 MongoDB

    has_many :discounts, order: :min_amount.asc
    

    【讨论】:

      【解决方案5】:

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

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

      变成

      has_many :options # In class Answer
      
      default_scope { order 'name' } # In class Option
      

      PS:我在做has_many :things, -&gt; {}时得到了ArgumentError: wrong number of arguments (1 for 0)

      【讨论】:

      • 不要使用默认范围。如果您习惯这样做,则可以在该魔术方法中添加更多逻辑。将来很难覆盖它。
      猜你喜欢
      • 2013-05-10
      • 1970-01-01
      • 1970-01-01
      • 2020-12-06
      • 2015-03-23
      • 2019-07-09
      • 1970-01-01
      • 2015-02-21
      相关资源
      最近更新 更多