ActiveSupport::Concern 未找到方法

ActiveSupport::Concern methods not found

我正在延长ActiveRecord::Base。在我的 lib 文件夹中,我有一个文件 mongoid_bridge.rb:

module MongoidBridge
  extend ActiveSupport::Concern
  module ClassMethods
    ...
  end
  module InstanceMethods
    ...
    def create_mongo(klass, fields)
      ...
    end
  end
end

ActiveRecord::Base.send(:include, MongoidBridge)

在 config/initializers 中,我有两个文件,为了以正确的顺序读取,每个文件都以 01、02 等为前缀。在 01_mongo_mixer.rb 中,我有以下内容:

require "active_record_bridge"
require "mongoid_bridge"

然后在 02_model_initializer.rb 中,我有以下内容:

MyActiveRecordModel.all.each do |model|
  model.create_mongo(some_klass, some_fields)
end

model 是 ActiveRecord 子类的实例,因此它应该在查找链中找到 create_mongo 实例方法。但是,它没有找到它,因为我收到以下错误:

Uncaught exception: undefined method `create_mongo' for #<MyActiveRecordModel:0x007fff1f5e5e18>

为什么找不到实例方法?

更新:

好像包含了ClassMethods下的方法,没有包含InstanceMethods下的方法:

singleton_respond = MyActiveRecordModel.respond_to? :has_many_documents
# => true
instance_respond = MyActiveRecordModel.new.respond_to? :create_mongo
# => false

您不需要 InstanceMethods 模块 - 您的模块应该如下所示

module MongoidBridge
  extend ActiveSupport::Concern
  module ClassMethods
  ...
  end

  def create_mongo
  end
end

rails 的早期版本使用实例方法模块,但最终决定这是多余的,因为您可以只在封闭模块中定义方法。使用 InstanceMethods 不久前被弃用(可能是 rails 3.2 - 我的记忆很模糊)并随后被删除