【问题标题】:Rails Cache Sweeper and Model Callback FiringRails 缓存清扫器和模型回调触发
【发布时间】: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_updatedo_something_cool 回调之前(或可能同时)被调用,这会导致问题。

有谁知道如何在模型回调后强制清扫器中的after_update 触发?有没有更好的方法来实现这一点?

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

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

【问题讨论】:

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


    【解决方案1】:

    它不会同时运行,但你是对的,看起来 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
    

    免责声明:我从来没有这样做过,而且我一直发现扫地机在 Rails 版本之间是喜怒无常的,所以对他们有用的东西可能对你不起作用:(

    【讨论】:

    • 嘿!感谢您的回答/cmets。我会看看我是否能解决这样的问题。如果没有提供其他答案,你肯定会得到赏金:-)
    • 感谢您的信息。原来你的答案有点错误,但它让我走上了正确的轨道,所以我会接受它。请参阅我更新的问题以获取更多信息。
    猜你喜欢
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多