railsで変化し続けるカラム(数値)をバリデーションに使いたい
railsで、ポイント(数量)を使う(支払う)機能をつくっており、
支払量をバリデーションしたいと考えています。
具体的には、支払量が支払ユーザーの口座残高以下ならバリデーション成功とみなし、BankAccountモデルのbalance(残高)を更新したいと思っています。
(残高が1000なら、支払量は1000までならモデル更新。支払量1001以上となり残高がマイナスになってしまうならばモデルは更新しない)
あらかじめ決まった数値なら
validates :amount, numericality: {only_integer: true, less_than_or_equal_to: 5000}
みたいにすればいいと思うのですが、
今回の様に更新され変化し続ける残高の数値をバリデーションに使うにはどうすればいいのでしょうか?
テーブルの状況
create_table "bank_accounts", force: :cascade do |t|
t.integer "user_id"
t.string "account_number"
t.decimal "balance"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["user_id"], name: "index_bank_accounts_on_user_id"
end
User(会員)モデル。※deviseで管理しています。
class User < ApplicationRecord
has_one :bank_account
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
end
BankAccount(口座)モデル。
class BankAccount < ApplicationRecord
#BankAccountはuserから1:1の関係で所有されている
belongs_to :user
#口座残高は数値か小数点のみ有効
validates :balance, presence: true, numericality: true
end
入力フォーム
<%= form_for @account_transaction do |f|%>
<div class="field">
<%= f.label :支払量 %>
<%= f.number_field :amount,min:1,max:9999999 %>
<%= f.submit"確認" %>
</div>
<% end %>