after_rollback
は、トランザクション中に保存または破棄されたオブジェクトに対してのみ呼び出されます。メインクラスまたはErrorLog
クラスにafter_rollback
コールバックを設定していますか?
実際にはafter_rollback
コールバックをErrorLog
クラスに使用するのが最も簡単な方法です。もちろん
class MyClass < ActiveRecord::Base
before_save :check_external
def check_external
unless external_says_i_am_okay?
ErrorLog.create!(:message => 'oops')
end
end
end
class ErrorLog < ActiveRecord::Base
after_rollback :save_anyway
def save_anyway
self.save!
end
end
は、あなたが得ることのパフォーマンスを考慮したいと思うかもしれないすべての言った:あなたはErrorLog
インスタンスを失うことになるだろう唯一の場合は、トランザクションがロールバックされている場合ので、このようなものが動作するはずですあなたのモデルを検証するための外部サービス。たとえば、Webリクエストの範囲内でオブジェクトを作成する場合、十分に速くない可能性があります。また、その時点までにトランザクションの範囲外になるため、ErrorLog#save
が失敗しないことを確認したいこともあります。
ありがとうございます。私は自分の間違いを理解し、 'ErrorLog'モデルの中で' after_rollback'を設定します。しかし、「self.save!」は何もしません。ログにSQL(0.1ms)BEGIN \ nSQL(0.1ms)COMMIT'が挿入されていません。 – Flexoid
トランザクション自体に「保存」されているため、すでに保存されていると思っているのだろうかと思います。その上に 'touch'を呼ぶか、属性を変更してセーブを人生に押し込むかどうかを調べることをお勧めします。コールバックが確実にそこにログインして呼び出されていることを確認する価値があります。 – Shadwell
ErrorLog.create!(self.attributes)のみでエラーを保存できました。それは汚れたハックのように見えますが、私は他に何をすべきかわかりません。手伝ってくれてありがとう。 – Flexoid