我非常渴望遇到一个问题。
我想注册自定义回调:after_something 然后将该回调用于观察者。
我已尝试使用define_callbacks,set_callbacks但观察者永远不会触发该回调。
我知道我可以使用AR回调,但我更喜欢在某些情况下使用我自己的回调。
由于
答案 0 :(得分:17)
如果有人在寻找:
,这是一个解决方案 你的模型中的称之为:
notify_observers(:after_my_custom_callback)
在你的观察者中只需定义方法:
def after_my_custom_callback(record)
#do things
end
答案 1 :(得分:1)
观察者使用标准的AR回调,因此它不会触发你的默认回调。
我认为发明新的回调(以及AR的monkeypatch默认行为)可能你应该使用AR。很难说你想要什么。你能举一些用例吗?
尝试类似
的东西before_save MyCallbacks.new, :if => :some_condiditons_meet?
class MyCallbacks
def before_save(object)
sophistcated_use(object) if object.valid?
damn_have_it?
end
end
它实际上涵盖了某个级别的观察者行为
< - 更新 - >
save,save!或destroy调用的整个回调链在事务中运行。这包括after_ * hooks。如果一切顺利,一旦链完成就会执行COMMIT。
我认为单个观察者的整个想法不是最好的解决方案。在更多依赖关系到来后,您的逻辑将变得非常复杂。定义自己的事务包装器很好,但你真的需要它吗?也许你可以重新安排模型来实现它,而无需编写自己的交易案例。
例如
class Friendship < ActiveRecord::Base
belongs_to :user
has_many :users, :through => :groups
after_validation :save_my_records
def save_my_records
user.friend.history.save
user.history.save
end
end
朋友是对象=&gt;有自己的观察员 其中history是object =&gt;有自己的观察员
这是非常抽象的,但是如果没有你的代码,我也不知道如何提供一些建设性的例子,而且after_validation不是保存任何我认为的最好的地方。
还有notify_observer听起来像黑客一样: - )
答案 2 :(得分:1)
感谢Alex的回答,我可以通过定义一个应该被调用而不是define_model_callbacks_for_observers
的{{1}}方法来解决这个问题(你可能想把它放到一个模块中):
define_model_callbacks