0

私は次のクラスを持っています:

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、新しく作成されたスロットをリロード/再キャッシュできます。

4

1 に答える 1

5

同時に実行されることはありませんが、その通りです。モデル1の前にSweeperコールバックが実行されているようです。

この投稿は役立つかもしれません:http://upstre.am/2007/10/27/using-and-testing-activerecordrails-observers/

約半分(「callback:after_read」を検索)で、オブザーバー用のカスタムコールバックを作成しようとしました。これを使用して、モデルのクール化が完了したときに呼び出されるafter_something_coolARObserverメソッドを作成できます。

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バージョン間で気まぐれであることが常にわかっているため、それらに対して機能したものが機能しない可能性があります:(

于 2010-03-11T17:30:14.677 に答える