1

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 には 2 つのファイルがあり、正しい順序で読み取られるように、それぞれに 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
4

1 に答える 1

1

InstanceMethods モジュールは必要ありません。モジュールは次のようになります。

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

  def create_mongo
  end
end

Rails の以前のバージョンでは、インスタンス メソッド モジュールを使用していましたが、最終的には、モジュールを囲むモジュールでメソッドを定義するだけでよいため、これは冗長であると判断されました。InstanceMethods の使用はしばらく前に非推奨になり (おそらく Rails 3.2 - 私の記憶はあいまいです)、その後削除されました

于 2015-04-30T23:41:16.527 に答える