railsで複数のモデル更新を1セットにしたトランザクション処理がうまくいかない
複数のモデルの更新を一つの塊としてトランザクション処理したいと考えています。
例えば、口座振替処理みたいなことする際2つのモデルが動くとします。
AccountTransactionモデルには、
支払側の口座id(withdrawal_account_id)
受取側の口座id(deposit_account_id)
取引額(amount)
が新規記録(save)され、
BasicIncomeAccount(口座)モデルでは、
支払側と受取側の残高(balance)が増減されて更新(update)し、
完全成功のみ2つのモデルへの処理を確定します。
そこで以下のようなコードを書いてみたのですが、モデル更新が失敗してしまいます。
AccountTransactionへのsaveは大丈夫なのですが、
BasicIncomeAccountへのupdateがうまくいっていないみたいです。
class AccountTransactionsController < ApplicationController
def create
begin
ActiveRecord::Base.transaction{
@account_transaction = AccountTransaction.new(
withdrawal_account_id: current_user.basic_income_account.id,
deposit_account_id: BasicIncomeAccount.find_by(account_number: params[:account_transaction][:deposit_account_id]).id,
amount: params[:account_transaction][:amount]
)
@account_transaction.save!
#以下のコードは、BasicIncomeAccount(口座)に記録するためのもの
@withdrawal_basic_income_account = current_user.basic_income_account
@deposit_basic_income_account = BasicIncomeAccount.find_by(account_number: params[:account_transaction][:deposit_account_id])
@amount = params[:account_transaction][:amount].to_f
#以下の2行で取引した双方の口座残高を更新しようとするが失敗
@withdrawal_basic_income_account.update(balance: @withdrawal_basic_income_account.balance - @amount)
@deposit_basic_income_account.update(balance: @deposit_basic_income_account.balance + @amount)
}
redirect_to root_path
rescue #Exception => e
flash[:notice] = "失敗しました。リトライしてみてください"
render "new"
end
どうすれば、2つのモデル更新を完全成功させることができるのか、教えて頂ければ幸いです。