0

注文のコントローラーで、注文の属性を更新する前に、別のオブジェクトに変更を加えています。

def update
  @order.organisation.something = @order.something
  @order.organisation.save!

  if @order.update_attributes(params[:order])
    redirect_to @order
  else
    render :edit
  end
end

理由は、注文が新しい値を受け取る前に組織を更新するために、注文の以前の値 (ここでは「何か」と呼ばれる) が必要だからです。

無効な属性が原因で update_attributes が失敗した場合、組織への変更もロールバックされると予想されますが、明らかにそうではありません。私の質問は、なぜこの変更が「暗黙の」トランザクションの一部ではないのですか? そして、どうすればそれをその一部にすることができますか?

4

1 に答える 1

0

私はあなたが Java から来ており、サーバー側で状態を管理するためにトランザクションを広範囲に使用していると仮定しています。

rails はこの点で非常に異なっています。データを更新するときにのみトランザクションを実行します。createorの呼び出しは単一のトランザクションになり、ステートメントをグループ化する場合は、自分でトランザクションを処理する必要がありますsaveupdate_attributes

私はかつてこの機能を支援するためにactive_serviceというgemを作成しましたが、それは汎用のRailsプログラミングのために肥大化しただけだと思います. ただし、レールで自分でトランザクションを処理する方法を示しています。

transactionそれは実際には非常に単純です。すべてActiveRecordのクラスを呼び出すだけです。

User.transaction { [your transactional code here] }
于 2013-10-20T14:56:28.423 に答える