質問編集履歴
2
誤字修正
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
図を挿入
test
CHANGED
File without changes
|
test
CHANGED
@@ -6,15 +6,35 @@
|
|
6
6
|
|
7
7
|
そこで、
|
8
8
|
|
9
|
-
「
|
9
|
+
「**複数のモデルへの同時更新が完全成功しない限り、モデルの更新確定できないようにしたい**」
|
10
|
-
|
10
|
+
|
11
|
-
「もしも、
|
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
|
|