私は次のクラスを持っています:
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_update
、スイーパー内がコールバックの前に(またはおそらく同時に)呼び出され、do_something_cool
問題を引き起こしていることです。
after_update
モデルのコールバック後にスイーパーを強制的に起動する方法を知っている人はいますか?これを達成するためのより良い方法はありますか?
更新/修正:以下の回答とは異なり、オブザーバーのコールバックは実際には正しい順序で実行されています(モデルのコールバックの後)。これを発見したとき、私は何か他のものが間違っているに違いないことに気づきました。
このdo_something_cool
メソッドは、徹夜のスロットをすべて破棄し、それらを正しい数の正しい時間のスロットに置き換えます。オブザーバーは、スロットの数に依存して、警戒がどのくらい続くべきかを判断します。つまり、根本的な問題は、vigilのすべてのスロットが破壊され、そのデータがキャッシュされていたためvigil.slots
、オブザーバーから呼び出したときに、キャッシュされた(破壊されたスロット)データを使用していたことでした。解決策:最後にvigil.slots(true)を呼び出すだけでdo_something_cool
、新しく作成されたスロットをリロード/再キャッシュできます。