1

私のモデルには、外部サービスにリクエストを送信するカスタム検証メソッドがあります。応答に基づいて、errors配列にエラーがある場合は追加します。

エラーがある場合は、ErrorLogエラーログを表すモデルの新しいレコードも作成する必要があります。問題は、検証が失敗すると、ROLLBACKデータベースで実行され、すべての新しいErrorLogレコードが失われることです。それを実装するための最良の方法は何ですか?

after_rollbackまた、それは何らかの理由で呼び出されていないことを言う必要があります。

4

1 に答える 1

3

after_rollbackトランザクション中に保存または破棄されたオブジェクトに対してのみ呼び出されます。after_rollbackメインクラスまたはクラスにコールバックを設定していますErrorLogか?

実際、クラスでafter_rollbackコールバックを使用するErrorLogのが最も簡単なアプローチのようです。インスタンスを失う唯一のケースは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

Of course having said all that you might want to consider the performance of getting an external service to validate your models. It might not be sufficiently quick if you're creating objects in the scope of a web request for example. You'd also want to make sure that the ErrorLog#save wouldn't fail as you're going to be outside the scope of a transaction by that point.

于 2012-05-03T08:24:32.860 に答える