代码之家  ›  专栏  ›  技术社区  ›  Topher Fangio

Rails缓存清扫器和模型回调触发

  •  0
  • Topher Fangio  · 技术社区  · 15 年前

    我有以下课程:

    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 模型中的方法在正确运行之前已完成。问题是 后更新 在清扫器被呼叫之前(或可能同时) 有什么酷的吗? 回调会导致问题。

    有人知道怎么强制 后更新 在模型回调后要在清扫器中启动吗?有更好的方法来实现这一点吗?

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

    这个 有什么酷的吗? 方法销毁一个vigil的所有插槽,并用正确的时间替换为正确数量的插槽。观察者依靠插槽的数量来计算守夜应该持续多长时间。所以,根本的问题是所有vigil的插槽都被销毁了,数据被缓存了,所以当我调用 vigil.slots 从观察者的角度来看,它使用的是缓存(销毁的插槽)数据。解决方案:只需在结束时调用vigil.slots(true)。 有什么酷的吗? 重新加载/重新缓存新创建的插槽!

    1 回复  |  直到 15 年前
        1
  •  4
  •   deanWombourne    15 年前

    它不会同时运行,但您是对的,它看起来像是在模型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版本之间是喜怒无常的,所以为它们工作的可能不适合您:(

    推荐文章