呼び出しをtransaction
次のように囲みます。
トランザクションは保護ブロックであり、SQL ステートメントはすべて 1 つのアトミック アクションとして成功する場合にのみ永続的になります。古典的な例は、引き出しが成功した場合にのみ預金を持つことができる 2 つの口座間の送金であり、その逆も同様です。トランザクションは、データベースの整合性を強化し、プログラム エラーやデータベースの故障からデータを保護します。したがって、基本的に、一緒に実行する必要がある、またはまったく実行しないステートメントが多数ある場合は、トランザクション ブロックを使用する必要があります。
def test_action
User.transaction do
a = User.find_by_id(params[:user_id])
# some calculations.....
b = Reporst.find_by_name(params[:report_name])
# some calculations.....
c = Places.find_by_name(params[:place_name])
end
end
それらは異なるモデルを呼び出しますが、アクションは DB への 1 つの呼び出しにカプセル化されます。しかし、それはすべてか無かです。1 つが途中で失敗すると、カプセル全体が失敗します。
トランザクション クラス メソッドは Active Record クラスで呼び出されますが、トランザクション ブロック内のオブジェクトがすべてそのクラスのインスタンスである必要はありません。これは、トランザクションがモデルごとではなく、データベース接続ごとであるためです。