将范围添加到 ActiveRecord 会导致层次结构错误

2023-12-12

我刚刚转换了所有 Rails 模型以供使用uuid作为主键替换,但这打破了#first and #last方法,所以我尝试添加一个按以下方式排序的默认范围created_at代替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.


看起来您正在尝试创建一个问题并让您的模型包含它。为此,我建议采用不同的方法,而不是通过初始化程序来完成,而是作为实际关注点,按照 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

在模型的开头。

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

作为猴子补丁:

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

或者像你一样:

# config/initializers/name.rb
ActiveRecord::Base.send :include, ModuleName
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将范围添加到 ActiveRecord 会导致层次结构错误 的相关文章

随机推荐