将范围添加到活动记录会导致层次结构错误



我刚刚将所有 Rails 模型转换为使用 uuid 作为主键替换,但这破坏了#first#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

如果 <= Rails 3,请将以下内容添加到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

最新更新