###・前提・実現したいこと
ruby(rails)で1:1の関連付けをしたユーザーモデルと口座モデルがあり、
deviseでユーザーが新規会員登録と同時に自動的に口座を作成する実装をしました。
このときランダムかつユニークで主キーとなり得る11桁の数字だけの乱数(口座番号)を作成して登録するのですが、
万が一に口座番号が被って登録ができなかった場合、再び乱数を生成して登録を成功させるように
するにはどうすればよろしいでしょうか?
###現状のコード
・ユーザーモデルと口座モデルは1:1で関連付けをしてあります。
・deviseのカスタマイズした新規会員登録コントローラに、口座への同時作成の指示を記述しています。
・口座モデルには、口座番号がユニークであるかどうかを検証しています。
app/controllers/users/registrations_controller.rb
class Users::RegistrationsController < Devise::RegistrationsController def new super end # POST /resource def create super #Userの子要素であるbasic_income_accountを関連付ける resource.build_basic_income_account #同時につくられるBI口座の登録内容 #12桁のランダムでユニークな口座番号を作成する require 'securerandom' n = 12 resource.basic_income_account.account_number = format("%0#{n}d", SecureRandom.random_number(10**n)) #同時に作られる口座の残高は0とする。 resource.basic_income_account.balance = 0 resource.save end
/home/vagrant/megterra/app/models/basic_income_account.rb
class BasicIncomeAccount < ApplicationRecord #BasicIncomeAccountはuserから1:1の関係で所有されている belongs_to :user #ユーザーIDが存在するなら検証成功 validates :user_id, presence:true #口座番号が存在し、値(口座番号)がユニーク(被らない番号)なら検証成功 validates :account_number, presence: true, uniqueness: true #口座残高は数値か小数点のみ有効 validates :balance, presence: true, numericality: true end
###補足情報(言語/FW/ツール等のバージョンなど)
Rails 5.1.3
ruby 2.4.1
devise (4.3.0)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/16 01:47 編集
退会済みユーザー
2017/11/16 02:05
2017/11/16 11:45 編集
2017/11/16 08:45
2017/11/16 12:13 編集