【发布时间】:2011-01-24 09:18:21
【问题描述】:
我有以下课程:
class Vigil < ActiveRecord::Base
after_update :do_something_cool
private
def do_something_cool
# Sweet code here
end
end
class NewsFeedObserver < ActionController::Caching::Sweeper
observe Vigil
def after_update
# Create a news feed entry
end
end
一切都按预期进行;但是,sweeper 中的after_update 要求模型中的do_something_cool 方法完成后才能正常运行。问题是清扫器中的after_update 在do_something_cool 回调之前(或可能同时)被调用,这会导致问题。
有谁知道如何在模型回调后强制清扫器中的after_update 触发?有没有更好的方法来实现这一点?
更新/修复:事实证明,与下面的答案不同,观察者回调实际上是以正确的顺序触发(在模型回调之后)。当我发现这一点时,我意识到肯定还有其他问题。
do_something_cool 方法会销毁所有守夜人的插槽,并用正确数量和正确时间的插槽替换它们。观察者依靠时段的数量来确定守夜应该持续多长时间。所以,潜在的问题是所有守夜人的插槽都被破坏了,并且这些数据被缓存了,所以当我从观察者那里调用vigil.slots 时,它正在使用缓存的(被破坏的插槽)数据。解决方案:只需在do_something_cool 末尾调用 vigil.slots(true) 即可重新加载/重新缓存新创建的插槽!
【问题讨论】:
标签: ruby-on-rails callback observer-pattern