

**複数のモデルの更新を一つの塊としてトランザクション処理したい** と考えています。

例えば、口座振替処理みたいなことする際２つのモデルが動くとします。  
AccountTransactionモデルには、  
支払側の口座id(withdrawal_account_id)  
受取側の口座id(deposit_account_id)  
取引額(amount)  
が新規記録(save)され、  
BasicIncomeAccount(口座）モデルでは、  
支払側と受取側の残高(balance)が増減されて更新(update)し、  
完全成功のみ２つのモデルへの処理を確定します。

そこで以下のようなコードを書いてみたのですが、モデル更新が失敗してしまいます。  
AccountTransactionへのsaveは大丈夫なのですが、  
BasicIncomeAccountへのupdateがうまくいっていないみたいです。

[code]

    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
        #以下の２行で取引した双方の口座残高を更新しようとするが失敗
        @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
    
[/code]

どうすれば、２つのモデル更新を完全成功させることができるのか、教えて頂ければ幸いです。


CC BY-SA 3.0
2017-12-18T01:59:35.520
40348
2017-12-18T08:08:22.673
26666
question
ruby-on-rails ruby
railsで複数のモデル更新を１セットにしたトランザクション処理がうまくいかない


結論から言うと、BasicIncomeAccountモデルに不適切かつ不要なカスタムバリデーションを記述してしまったことが問題の原因でした。  
不適切かつ不要なバリデーション記述を削除したら、  
上記のaccount_transactions_controller.rbに記述したコードは正常に稼働します。


CC BY-SA 3.0
2017-12-18T08:08:22.673
40358
2017-12-18T08:08:22.673
26666
40348
answer