为多个模型动态实例化ActiveRecord Observer

时间:2010-12-08 16:39:47

标签: 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

我最初的方法是定义AR基础中包含的类方法:

module ClassMethods

  def observe_me
    @observe_me = true
  end

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

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

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进行攻击,但没有运气。

所以,就像现在一样:

观察者已定义,但不知道要观察哪些模型。 模型被定义并标记自己被观察,但观察者已被观察到。

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

1 个答案:

答案 0 :(得分:-1)

@gavin:Rails3中应用程序初始化的结构发生了变化 - 这可能是你的问题。

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

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