2017-04-18 30 views
1

after_saveは、レコードが保存されると(ただし、コミットされる前に)呼び出されます。 after_createが呼び出されている間は、データベーストランザクションがコミットされた後です。コードは、オブジェクトがコミットされる前に実行されているため、オブジェクトを見つけることができませんSidekiqジョブを説明し、このポストhttp://www.justinweiss.com/articles/a-couple-callback-gotchas-and-a-rails-5-fix/以外Rails after_saveとafter_commit gotcha

、私はafter_createまたはafter_commitがより適しているwheterを決定するために知っておく必要がある他の落とし穴は何ですか使用する?

+0

[Rails 4の\ _updateコールバックの理解](http://stackoverflow.com/questions/43310768/understanding-after-update-callback-in-rails-4)の可能な複製 –

答えて

4

あなたが説明しているように、Sidekiqが「速すぎる」のを避けたいのであれば、最もよく見られる解決策はafter_commitです。

これには大きな欠点があります。モデル内で何かを更新している場合は、after_commitフックが再び実行されます。これが決して起こらないことを確かめてください。
あなたがTextMessageを作成し、status='unsent'でデータベースにこれを保存し、after_commitフックに、あなたがAPIを介して、あなたのSMSゲートウェイにこれを送信するためのSidekiqJobを追加しているしている:

は、例を参照してください。
このAPIは、リモートで追跡するためのIDを返します。これを以前のバージョンからTextMessageに更新します。これにより、TextMessageの再送がトリガーされます。

もちろん、after_commitは、などのように、on: :updateおよびon: createにも対応します。

ここで、ジョブでは、ジョブがunsent以前であることを確認できますが、これが保証されていても再送信が発生する可能性があります。

これは無限ループを作るのは簡単ですし、注意しないとかなりの費用がかかるかもしれません。

関連する問題