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

时间:2013-12-29 11:03:24

标签: ruby-on-rails rails-activerecord

我刚刚将所有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

1 个答案:

答案 0 :(得分: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

如果< = 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