【问题标题】:Adding scope to ActiveRecord causes hierarchy error向 ActiveRecord 添加范围会导致层次结构错误
【发布时间】:2014-01-16 10:46:45
【问题描述】:

我刚刚将我的所有 Rails 模型转换为使用 uuid 作为主键替换,但这打破了 #first#last 方法,所以我试图添加一个按 @ 排序的默认范围987654324@ 而不是 id

我的担忧是这样的:

# config/initializers/uuid_support.rb
module 
  extend ActiveSupport::Concern

  included do
    default_scope -> { order 'created_at ASC' }
  end
end
ActiveRecord::Base.send :include, UuidSupport

添加后,在任何模型上执行提取时都会引发以下错误:ActiveRecord::ActiveRecordError: ActiveRecord::Base doesn't belong in a hierarchy descending from ActiveRecord

【问题讨论】:

    标签: ruby-on-rails rails-activerecord


    【解决方案1】:

    看起来您正在尝试创建一个关注点并让您的模型包含它。为此,我推荐一种不同的方法,而不是通过初始化程序来完成,而是作为一个实际问题,按照 Rails 的预期方式。

    去掉你的初始化器,把下面的代码放到app/models/concerns/module_name.rb

    module ModuleName # replace with desired name
      extend ActiveSupport::Concern
    
      included do
        default_scope -> { order 'created_at ASC' }
      end
    end
    

    如果 application.rb 以加载关注点:

    config.autoload_paths += %W(
      #{config.root}/app/models/concerns
    )
    

    通过做将您的关注点包含在您的模型中

    include ModuleName
    

    在模型的开头。

    如果您使用初始化程序执行此操作的原因是因为您希望每个模型都包含此行为,那么现在是时候编写初始化程序了。

    作为猴子补丁:

    # config/initializers/name.rb
    class ActiveRecord::Base
      include ModuleName
    end
    

    或者像你一样:

    # config/initializers/name.rb
    ActiveRecord::Base.send :include, ModuleName
    

    【讨论】:

    • 不幸的是,在使用初始化程序(使用任何方法)时,我仍然遇到错误。 ActiveRecord::ActiveRecordError: ActiveRecord::Base doesn't belong in a hierarchy descending from ActiveRecord。引发错误的来源在这里:github.com/rails/rails/blob/master/activerecord/lib/…
    • 另外,将关注点直接包含在任何特定模型中,include UuidSupport,工作正常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-05
    • 2010-10-09
    • 2014-05-31
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    相关资源
    最近更新 更多