Rails Cache Sweeper和Model Callback Firing

时间:2010-03-06 05:18:29

标签: ruby-on-rails callback observer-pattern

我有以下课程:

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

一切都按预期工作;但是,清除程序中的after_update要求模型中的do_something_cool方法在正常运行之前已完成。问题是清除程序中的after_updatedo_something_cool回调之前(或可能同时)被调用,这会导致问题。

有没有人知道如何在模型回调后强制扫地机中的after_update点火?是否有更好的方法来实现这一目标?

更新/修复:事实证明,与下面的答案不同,观察者回调实际上是以正确的顺序触发(在模型回调之后)。当我发现这一点时,我意识到别的东西一定是错的。

do_something_cool方法会破坏所有守夜的插槽,并用正确的时间替换正确数量的插槽。观察者依靠槽数来确定守夜应该持续多长时间。因此,潜在的问题是所有守夜的插槽都被破坏,并且数据被缓存,所以当我从观察者调用vigil.slots时,它正在使用缓存(销毁的插槽)数据。解决方案:只需在do_something_cool末尾调用vigil.slots(true)来重新加载/重新缓存新创建的插槽!

1 个答案:

答案 0 :(得分:4)

它不会同时运行但是你是对的,看起来Sweeper回调正在模型之前运行。

这篇文章可能会有所帮助:http://upstre.am/2007/10/27/using-and-testing-activerecordrails-observers/

大约一半(搜索'callback:after_read')他们试图为他们的观察者创建自定义回调。您可以使用它来创建一个after_something_cool ARObserver方法,该方法在模型完成时被调用,例如。

class Vigil < ActiveRecord::Base
  after_update :do_something_cool

  private
    def do_something_cool
      # Sweet code here
      callback :after_something_cool
    end
end

class NewsFeedObserver < ActionController::Caching::Sweeper
  observe Vigil

  def after_something_cool
    # Create a news feed entry
  end
end

免责声明:我从来没有这样做过,而且我总是发现扫地机在导轨版本之间存在气质,所以对他们有用的东西可能不适合你:(