安らかな動詞全体が単一の包括的なトランザクションの下にあるということですか? つまり、UPDATE、DELETE、または CREATE 操作の処理の任意の時点で検証またはコールバックでエラーを発生させた場合、以前のコールバックで実行した可能性のあるすべてのデータベース操作もロールバックされますか? 簡潔に言えば、コールバックまたは検証でエラーを発生させると、その動詞アクションのデータベースでまったく変更が発生しないようになりますか?
3 に答える
安らかな動詞全体が単一の包括的なトランザクションの下にあるということですか?
いいえ
UPDATE、DELETE、または CREATE 操作の処理中の任意の時点で検証またはコールバックでエラーが発生した場合、以前のコールバックで実行した可能性のあるすべてのデータベース操作もロールバックされますか?
いいえ。
コールバックまたは検証でエラーを発生させると、その動詞アクションのデータベースでまったく変更が発生しないようになりますか?
いいえ。
この動作が必要な場合は、コントローラーでトランザクションを明示的に作成するか (他のユーザーが提供する例を参照)、 を使用しaround_filter
てすべての安静なアクションに動作を関連付けることができます。
デフォルトでは、トランザクション内に記述されたデータベース コードはありません。コードでそれを行うように指示する必要があります。
def create
Model.transaction do
Model.create!(params[:model])
Model.association.create!(params[:association])
end
rescue ActiveRecord::RecordNotSaved, ActiveRecord::RecordInvalid
flash[:notice] = "That record could not be saved."
render :action => "new"
end
#create! を使用して メソッドはレコードを保存しようとし、失敗すると例外を発生させ、トランザクション ブロック内で既に実行されたコードをロールバックします。
アクションを救出しない場合、パブリック ディレクトリに 405.html が存在する場合は、そのディレクトリにリダイレクトされます (私はそう思います)。
一部のメソッド (作成、破棄) は、すぐにデータベースに移動します。トランザクションは、次のように ActiveRecord から派生したクラスで transaction メソッドを使用して発生します。
Student.transaction do
Course.transaction do
course.enroll(student)
student.units += course.units
end
end
(この例は複数のデータベースの場合です。単一のデータベースの場合、必要なトランザクションは 1 つだけです。)
その後、これらのトランザクションをロールバックできます。トランザクション内でスローされた例外は、ロールバック後に伝播されます。
これは、トランザクションを持つデータベースに依存します。
注意: save と destroy はトランザクションでラップされます。