質問編集履歴

2

誤字修正

2017/12/18 09:29

投稿

zendendo
zendendo

スコア43

test CHANGED
File without changes
test CHANGED
@@ -8,9 +8,7 @@
8
8
 
9
9
  「**複数のモデルへの同時更新が完全成功しない限り、モデルの更新確定できないようにしたい**」
10
10
 
11
- 「もしも、複数のモデルに記述してあるvalidationにどれか一つ引っかかって記録ができないのならば、
11
+ **もしも、複数のモデルに記述してあるvalidationにどれか一つ引っかかって記録ができないのならば、同時更新できないとみなされて取引が無効になるのでは?**」
12
-
13
- 同時更新できないとみなされて取引が無効になるのでは?」
14
12
 
15
13
  と考え、3つのモデルにまたがるトランザクション処理を記述しました。
16
14
 
@@ -386,7 +384,107 @@
386
384
 
387
385
 
388
386
 
389
-
387
+ 追記(最終的に成功したコード)
388
+
389
+ 自己解決ではないので、ここに最終的に成功したコードを記述します。
390
+
391
+ ```ruby
392
+
393
+ class AccountTransactionsController < ApplicationController
394
+
395
+
396
+
397
+ def new
398
+
399
+ @account_transaction = AccountTransaction.new
400
+
401
+ end
402
+
403
+
404
+
405
+ def create
406
+
407
+ begin
408
+
409
+ ActiveRecord::Base.transaction{
410
+
411
+ @account_transaction = AccountTransaction.new(
412
+
413
+ withdrawal_account_id: current_user.basic_income_account.id,
414
+
415
+ deposit_account_id: BasicIncomeAccount.find_by(account_number: params[:account_transaction][:deposit_account_id]).id,
416
+
417
+ amount: params[:account_transaction][:amount]
418
+
419
+ )
420
+
421
+ @account_transaction.save!
422
+
423
+
424
+
425
+ @account_transaction.deposits_and_withdrawals.build(
426
+
427
+ transaction_type: "出金",
428
+
429
+ basic_income_account_id: current_user.basic_income_account.id,
430
+
431
+ amount: -1 * params[:account_transaction][:amount].to_f
432
+
433
+ )
434
+
435
+ @account_transaction.deposits_and_withdrawals.build(
436
+
437
+ transaction_type: "入金",
438
+
439
+ basic_income_account_id: BasicIncomeAccount.find_by(account_number: params[:account_transaction][:deposit_account_id]).id,
440
+
441
+ amount: params[:account_transaction][:amount].to_f
442
+
443
+ )
444
+
445
+ @account_transaction.save!
446
+
447
+
448
+
449
+
450
+
451
+ @withdrawal_basic_income_account = current_user.basic_income_account
452
+
453
+ @deposit_basic_income_account = BasicIncomeAccount.find_by(account_number: params[:account_transaction][:deposit_account_id])
454
+
455
+
456
+
457
+ @amount = params[:account_transaction][:amount].to_f
458
+
459
+
460
+
461
+ @withdrawal_basic_income_account.update!(balance: @withdrawal_basic_income_account.balance - @amount)
462
+
463
+ @deposit_basic_income_account.update!(balance: @deposit_basic_income_account.balance + @amount)
464
+
465
+
466
+
467
+ }
468
+
469
+ #完全成功なら、root_path(ホーム画面へ)
470
+
471
+ redirect_to root_path
472
+
473
+ #以下は例外が発生(プロセスの内どこかが失敗)したときに行う。rescueは自分でカスタマイズした例外処理を行えるが、railsが自動的に表示してくれるエラーを見たければ一旦resucueをコメントアウトしてみよう。
474
+
475
+ rescue e.message
476
+
477
+ #flash[:notice] = "失敗しました。リトライしてみてください"
478
+
479
+ #render "new"   
480
+
481
+ #rollback
482
+
483
+ end
484
+
485
+ end
486
+
487
+ ```
390
488
 
391
489
 
392
490
 

1

図を挿入

2017/12/18 09:29

投稿

zendendo
zendendo

スコア43

test CHANGED
File without changes
test CHANGED
@@ -6,15 +6,35 @@
6
6
 
7
7
  そこで、
8
8
 
9
- 3つのモデルへの同時更新が完全成功しない限り、モデルの更新確定できないようにしたい」
9
+ **複数のモデルへの同時更新が完全成功しない限り、モデルの更新確定できないようにしたい**
10
-
10
+
11
- 「もしも、3つのモデルに記述してあるvalidationにどれか一つが引っかかって記録ができないのならば、
11
+ 「もしも、複数のモデルに記述してあるvalidationにどれか一つが引っかかって記録ができないのならば、
12
12
 
13
13
  同時更新できないとみなされて取引が無効になるのでは?」
14
14
 
15
15
  と考え、3つのモデルにまたがるトランザクション処理を記述しました。
16
16
 
17
-
17
+ ```ここに言語を入力
18
+
19
+ モデルA.transaction do
20
+
21
+ #モデルAでやりたい処理
22
+
23
+ モデルB.transaction do
24
+
25
+ # モデルBでやりたい処理
26
+
27
+ モデルC.transaction do
28
+
29
+ # モデルCでやりたい処理
30
+
31
+ end
32
+
33
+ end
34
+
35
+ end
36
+
37
+ ```
18
38
 
19
39
  正しくない値(3つのモデルの内、1つのモデルのバリデーションに引っかかる値)を入力して取引が無効になるか試したのですが、その結果・・・
20
40