2012-09-03 29 views
19

簡単な質問。レコードが保存された後に後処理を実行するActiveRecordモデルがあります。したがって、モデルでは、Resqueキューにジョブを張るqueue_for_processingメソッドがあります。私のレコードが正常に保存された後にこれを実行させるために、私はモデルに次のように書いています。Rails:after_createの例外で保存を停止する

かなり簡単です。私は、昨夜、私のredisサーバーがダウンして事態がうまくいかないことを除いて、すべてが予想どおりに機能していると思っていました。レコードはまだ保存されていて、後で手動で処理することができると私は期待していました。しかし、queue_for_processingメソッドは例外(予期される動作)をスローし、レコードの保存を停止しています。

after_createの仕組みを誤解していますか?それとも、私の理解は正しいのでしょうか、ファンキーなことが起こっていますか?

ありがとうございました。

答えて

34

はい、コールバックはすべてトランザクション内にラップされます。 after_save

  • リターンbefore_saveから偽または類似のコールバック
  • 例外before_save中または類似のコールバック
  • 例外または類似のコールバック(after_create)

基本的には、次のようにロールバックが発生します

ロールバックを行わないでください:

あなたがロールバックを引き起こすために、例外をしたくない場合は after_saveまたは類似のコールバックから偽
  • リターン
  • 例外でafter_commit

、使用after_commit

+1

すばらしい返答をいただきありがとうございます。これはまた役に立ちました:http://rails-bestpractices.com/posts/695-use-after_commit –

+0

また、私をafter_commitに紹介してくれてありがとう。私はそれがRails3で導入されたことを知っていますが、私はメモを見逃しているに違いありません。私は新しいことを学ぶのが好きです:-) –

+0

すばらしい説明!簡潔さのため+1。 –

関連する問題