我刚刚将所有 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
关于ruby-on-rails - 向 ActiveRecord 添加范围会导致层次结构错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20824470/