私はオブザーバーを持っており、after_commit
コールバックを登録しています。 作成または更新後にそのファイルが解凍されたかどうかを確認するにはどうすればよいですか? アイテムが破棄されたとは、item.destroyed?
と尋ねると表示されますが、アイテムが保存されてから#new_record?
は機能しません。Rails 3:オブザーバーでafter_commitアクションを特定する方法は? (作成/更新/破棄)
私はafter_create
/after_update
を追加することによってそれを解決し、内部@action = :create
ような何かをしてafter_commit
で@action
をチェックするつもりだったが、オブザーバーインスタンスがシングルトンであり、それはに到達する前に、私はちょうど値を上書きする可能性があると思われますafter_commit
。だから私は醜いやり方でそれを解決し、after_create/updateのitem.idに基づいてマップにアクションを格納し、after_commitの値をチェックします。本当に醜い。
他の方法はありますか?それはプライベートな方法だし、観測者にそれが#send
でアクセスする必要があるものの
更新
@tardateが言ったように、transaction_include_action?
は、良い兆候です。
class ProductScoreObserver < ActiveRecord::Observer
observe :product
def after_commit(product)
if product.send(:transaction_include_action?, :destroy)
...
残念ながら、:on
オプションはオブザーバーでは機能しません。
observerの地獄をテストしてください(use_transactional_fixturesを使用している場合はtest_after_commit
gemを探してください)ので、新しいRailsバージョンにアップグレードしても動作するかどうかを知ることができます。 (3.2.9でテスト)
Updateは、代わりにオブザーバーの2
は、私が今activesupportの::懸念して、そこafter_commit :blah, on: :create
作品を使用しています。
after_commitが実行されたときにレコードが新しいかどうかを確認しようとしていますか?あなたの質問と答えを再度読んで、私はそれが混乱していると思う。言い換えるか、わかりやすい例を教えてください。 – charlysisto
シングルスレッドサーバーを使用している場合、初期のソリューションは機能します。あなたが使用していない場合は、この問題をきれいに解決するユニコーンなどのものに切り替えます。これはプログラミングモデルをはるかに容易にし、頭痛(これはこのようなもの)が少なくなり、最終的には速くなります。 + transaction_include_action?+を使用すると、レールテストスイートのテストでサポートされていない、サポートされていない保護されたrailsメソッドなので、クリーンではありません。次のバージョンにはその方法がないかもしれません。 –
@elado私は混乱しています。受け入れられた答え(tardate's)は、オブザーバー(チェスのコメントに記されているように)ではうまくいきません。代わりにコールバックを使用するように切り替えましたか?あなたの質問に説明を追加してください。 – Kelvin