3

現在、複数のモデルを監視するプラグイン/宝石を開発しようとしています。理想的には、オブザーバーは単一のメソッドを 1 つだけ使用して自動的にインスタンス化する必要があります...

class MyModel < ActiveRecord::Base

  # a class method like this will tell the observer to observe this model
    observe_me

end

私の最初のアプローチは、AR ベースに含まれるクラス メソッドを定義することでした。

module ClassMethods

  def observe_me
    @observe_me = true
  end

  def should_observe_me?
    @observe_me
  end
end
ActiveRecord::Base.extend(ClassMethods)

そして、これを使用して、オブザーバー内で観察するモデルを検出します。

class MyObserver < ActiveRecord::Observer

  # this should observe all models where should_observe_me? #=> true
  observe ActiveRecord::Base.descendants.select { |m| m.try(:should_observe_me?) }.map(&:model_name)

end

私が直面している問題は、モデルが定義される前にオブザーバーがロードされているため、ActiveRecord には子孫がなく、MyObserver は観察するモデルを認識していないことです。

私の次の試みは、ActiveRecord::Base.observers と ActiveRecord::Base.instantiate_observers をハックすることでしたが、うまくいきませんでした。

したがって、現時点では次のようになります。

オブザーバーは定義されていますが、観察するモデルがわかりません。モデルが定義され、監視対象としてフラグが立てられますが、オブザーバーは既に監視されています。

モデルが定義されるまでオブザーバーの読み込みを遅らせる方法はありますか、または誰かがこの問題に対するより良いアプローチを考えることができますか?

4

1 に答える 1

-1

@gavin: アプリケーションの初期化の構造が Rails3 で変更されました。これが問題かもしれません。

ClassMethods モジュールをいつ、どのように含めますか? Rails3 を使用していて、"require 'observe_me'" を $ROOT/config/environment.rb に追加した場合、説明した (誤った) 動作が表示されます。

その場合は、代わりに $ROOT/config/initializers/my_extensions.rb を作成し、そこに「require ...」を貼り付けます。

于 2011-01-29T00:02:49.807 に答える