複数のモデルを観察している時点でプラグイン/宝石を開発しようとしています。理想的には、観察者は複数モデルの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でハックすることでしたが、運はありませんでした。だから、
、それが現時点であるよう:
オブザーバーが定義されていますが、観察するためにどのモデルを知りません。 モデルは定義されており、それ自体にフラグが立てられますが、オブザーバーは既に観察されています。
モデルが定義されるまで、またはこの問題のより良いアプローチを考えるまで、オブザーバの読み込みを遅らせる方法はありますか?
これは私のためには機能しませんでした – Dinedal
@Dinedal:うまくいきませんでした。 –