現在、複数のモデルを監視するプラグイン/宝石を開発しようとしています。理想的には、オブザーバーは単一のメソッドを 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 をハックすることでしたが、うまくいきませんでした。
したがって、現時点では次のようになります。
オブザーバーは定義されていますが、観察するモデルがわかりません。モデルが定義され、監視対象としてフラグが立てられますが、オブザーバーは既に監視されています。
モデルが定義されるまでオブザーバーの読み込みを遅らせる方法はありますか、または誰かがこの問題に対するより良いアプローチを考えることができますか?