質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.98%

  • Ruby

    6395questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails

    6228questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

railsで銀行振替みたいな取引処理を再現したい

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 176

zendendo

score 19

実現したいこと

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つの記録は全てのプロセスが成功しないと
実行されないようにしたい(トランザクション処理にしたい)と考えています。

この場合、どんな風に実装すればいいのか教えて頂ければ幸いです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • masaya_ohashi

    2017/11/14 17:11

    なら安心です。ただ、私はこういったデータベース設計は知識が浅いので正しい回答をできる自信がありません。誰か助けて!

    キャンセル

  • umyu

    2017/11/14 22:44 編集

    データベース定義ですが、実際の取引機能(振替機能)に絞っているという認識でよいでしょうかー? 監査とかの関係上例えば、取引モデルには取引端末情報(店番、機番)が必要になることが多いのですが。

    キャンセル

  • zendendo

    2017/11/15 08:02

    ご指摘ありがとうございます。 初学者なもので、無知な部分が多くてすみませんが、 データベースの内容は、ゲーム内で完結するものを考えていたので、 取引機能に必要最低限なものだけに絞っています。 そのため実務的なことは考慮していませんでした。

    キャンセル

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.98%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    railsのcreate_atやupdated_atなどの時間がおかしい

    更新された時間がなぜか日本時間より-9時間された時間帯がupdated_atの時間表記になってしまうのですがなぜでしょうか?

  • 解決済

    【Ruby on rails】問い合わせフォームの作成途中でエラーが発生してしまっております。

    前提・実現したいこと Ruby on rails にて野球のイベントサイトを制作しております。 その機能の一つとして、問い合わせフォーム(メールにて管理者に内容を送信できる)の

  • 受付中

    bundlerのバージョン指定

    以下のコマンドで複数のbundlerを使い分けることができるかと思ったのですがエラーが出てしまいます どうすればよいでしょうか? $ bundle _1.10.6_ -v

  • 受付中

    Ruby on Railsで環境構築がうまくいかない

    ruby on rails をインストールして rails -v でバージョンを確認できるところまで行き bandler, ruby, homebrew, rvenv をインストー

  • 解決済

    Ruby on rails

    前提・実現したいこと Ruby on railsのテスト環境構築中です ターミナルから rails s  しても下記のエラーでつまずいています 発生している問題・エラ

  • 解決済

    asset/images内の画像を呼び出す方法

    railsでローカルのフォルダにある画像を格納したいのですが、方法がわかりません。フォルダにある複数の画像があるのでそれらを全て格納したいのですが、このサイトを見ていてもローカルの

  • 解決済

    railsのサーバー起動画面

    railsを使っているのですが、サーバーを立ち上げる時この画面以外にもう1パターンありますよね? この違いってなんなんですか?バージョンの違いですか?

  • 解決済

    Railsでエラー時にたまに見る `hoge' といった表記

    Railsでエラー時にたまに見る `hoge' といった表記があります。 最初が ` 最後が ' です。 何故違う記号を使ってワードを囲むのでしょうか The `rai

同じタグがついた質問を見る

  • Ruby

    6395questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails

    6228questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。