为多个模型动态实例化ActiveRecord观察者

为多个模型动态实例化ActiveRecord观察者,activerecord,ruby-on-rails-3,gem,observer-pattern,observers,Activerecord,Ruby On Rails 3,Gem,Observer Pattern,Observers,目前我正在尝试开发一个插件/gem,它可以观察多个模型。理想情况下,观察者应该只使用一个单例方法自动实例化 class MyModel < ActiveRecord::Base # a class method like this will tell the observer to observe this model observe_me end 然后使用它来检测要在观察者中观察的模型: class MyObserver < ActiveRecord::Obser

目前我正在尝试开发一个插件/gem,它可以观察多个模型。理想情况下,观察者应该只使用一个单例方法自动实例化

class MyModel < ActiveRecord::Base

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

end
然后使用它来检测要在观察者中观察的模型:

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
class MyObserver真的
观察ActiveRecord::Base.subjects.select{m|m.try(:should_observe_me?)}.map(&:model_name)
结束
我遇到的问题是,在定义模型之前加载了观察者,因此ActiveRecord没有子代,MyObserver不知道要观察哪些模型

我的下一次尝试是使用ActiveRecord::Base.observators和ActiveRecord::Base.instantiate_observators进行黑客攻击,但没有成功

因此,就目前而言:

Observer已定义,但不知道要观察哪些模型。 已定义模型并标记其自身以供观察,但观察者已被观察


有没有一种方法可以将观察者的加载延迟到模型定义之后,或者有人能想出一种更好的方法来解决这个问题?

@gavin:Rails3中应用程序初始化的结构已经改变——这可能是您的问题

何时/如何包括ClassMethods模块?如果您在Rails3中,并且在$ROOT/config/environment.rb中添加了“require'observe_me'”,那么您将看到所描述的(mis)行为

如果是这样,则创建$ROOT/config/initializers/my_extensions.rb并在其中粘贴“require…”

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