【发布时间】:2011-05-22 08:28:23
【问题描述】:
我目前正在尝试开发一个插件/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)
然后使用它来检测观察者中要观察的模型:
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,但没有成功。
所以,就目前而言:
已定义观察者,但不知道要观察哪些模型。 模型已定义并标记自己要观察,但观察者已被观察。
有没有办法可以将观察者的加载延迟到定义模型之后,或者有人可以想出更好的方法来解决这个问题?
【问题讨论】:
标签: activerecord ruby-on-rails-3 gem observer-pattern observers