ruby-on-rails - 向 ActiveRecord 添加范围会导致层次结构错误

标签 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

最佳答案

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

相关文章:

sql - 将 SQL 文件导入到 Rails 4 ActiveRecord 数据库?

ruby-on-rails - 如何在 Rails 中设置路由的默认格式?

html - Link_to 在 Rails 中显示 Action

ruby-on-rails - 使用 Stripe Connect 时,如何处理 'account with this email already exists' 错误?

ruby-on-rails - 在 ActiveRecord 关联范围 block 内访问所有者

ruby-on-rails - 条件与变量的关系

ruby-on-rails - 具有多个条件的 Rails 搜索

ruby-on-rails - Memcached 作为 Rails 中的对象存储

ruby-on-rails - 我认为这个查询是错误的吗?

mysql - RoR : if a company exists, 将company_id分配给用户,否则创建公司