3

複数のモデルを観察している時点でプラグイン/宝石を開発しようとしています。理想的には、観察者は複数モデルのActiveRecord Observerを動的にインスタンス化する

class MyModel < ActiveRecord::Base 

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

end 

私の最初のアプローチは、クラスメソッドは、ARベースに含ま定義することだった...ちょうど1つのシングルトンメソッドを使用して自動的にインスタンス化する必要があります。その後、

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 

私はに実行している問題は、モデルが定義される前にActiveReので、観察者は、ロードされていることですコードには子孫がなく、MyObserverはどのモデルを観察するのかわかりません。

私の次の試みは、ActiveRecord :: Base.observersとActiveRecord :: Base.instantiate_observersでハックすることでしたが、運はありませんでした。だから、

、それが現時点であるよう:

オブザーバーが定義されていますが、観察するためにどのモデルを知りません。 モデルは定義されており、それ自体にフラグが立てられますが、オブザーバーは既に観察されています。

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

答えて

-1

@gavin:Rails3でアプリケーション初期化の構造が変更されました。これは問題の可能性があります。

どのようにClassMethodsモジュールを組み込んでいますか?もしあなたがRails3にいて、 "require 'observe_me'を$ ROOT/config/environment.rbに追加した場合は、あなたが記述する(誤った)振る舞いを見るでしょう。

そうであれば、代わりに$ ROOT/config/initializers/my_extensions.rbを作成し、そこに「require ...」を貼り付けます。

+0

これは私のためには機能しませんでした – Dinedal

+0

@Dinedal:うまくいきませんでした。 –

関連する問題