我正在尝试开发一个插件/ 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进行攻击,但没有运气。
所以,就像现在一样:
观察者已定义,但不知道要观察哪些模型。 模型被定义并标记自己被观察,但观察者已被观察到。
有没有办法可以延迟观察者的加载,直到定义模型之后,或者有人能想出更好的方法解决这个问题吗?
答案 0 :(得分:-1)
@gavin:Rails3中应用程序初始化的结构发生了变化 - 这可能是你的问题。
何时/如何包含ClassMethods模块?如果您在Rails3中,并且如果您在$ ROOT / config / environment.rb中添加了“require'vispect_me'”,那么您将看到您描述的(错误)行为。
如果是这样,请创建$ ROOT / config / initializers / my_extensions.rb并在其中粘贴“require ...”。