###実現したいこと
ruby(ruby on rails)で単一のポイントを取引する銀行みたいなアプリをつくっています。
やりたい事を一言でまとめるとDB設計が完了したので「取引機能(振替機能)を実装をしたい」のですが、
思ったよりも複雑で混乱しています。
basic_income_account(口座モデル)
・user_id
・account_number(口座番号)
・balance(口座残高)
・update_at(更新日時)
account_transaction(取引モデル)
・withdrawal_account_number(出金口座)
・deposit_account_number(入金口座)
・amount(取引額)
・created_at(作成日時)
deposits_and_withdrawals(入出金モデル)
・account_transaction_id(外部キー)
・transaction_type(入金か出金かのいずれかを記録する)
・amount(取引額)
・created_at(作成日時)
口座モデルは、取引モデルと1:多(口座はたくさん取引を持つ)関係。
取引モデルは、入出金モデルと1:多(取引モデルはたくさんの入出金を持つ)関係。
入出金モデルは、口座モデルと多:1(多数の入出金は、一つの口座が持つ)関係。
###実現したいこと詳細
まず支払ユーザーは取引入力フォームで、
支払先の口座番号と取引額を入力します。
するとデータベースでは、
取引モデルで
「取引id(主キー)」と「出金(支払側)口座番号」と「入金(受取側)口座番号」と「取引額」が1件のレコードとして記録されます。
次に入出金モデルで、
「入出金id」と「取引ID(取引テーブルから参照している外部キー)」と「取引内容(入金か出金か)」と「取引額」が
2件分のレコード(出金で1回、入金で1回)として記録されます。
最後に口座モデルで更新が行われ
出金側の口座残高は減少し、入金側の口座残高が増加し取引が完了となります。
そして、データの整合性を保つ為にこの3つの記録は全てのプロセスが成功しないと
実行されないようにしたい(トランザクション処理にしたい)と考えています。
この場合、どんな風に実装すればいいのか教えて頂ければ幸いです。
あなたの回答
tips
プレビュー