gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 04:18:48 32 4
gpt4 key购买 nike

我目前正在尝试开发一个插件/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,但没有成功。

所以,就目前而言:

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

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

最佳答案

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

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

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

关于activerecord - 为多个模型动态实例化 ActiveRecord Observer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4389901/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com