【问题标题】:verifying numeric value for activerecord validation when condition is set设置条件时验证活动记录验证的数值
【发布时间】:2018-02-01 10:37:05
【问题描述】:

我正在尝试为来自不同银行的转账金额设置一个限制,我正在对模型进行验证,以评估账户的收款银行是否与其执行转账的银行不同。但是,验证没有按预期工作,因为即使数量小于已设置的限制,它也不允许执行操作。

这是我进行的测试:

require 'rails_helper'
RSpec.describe Transfer, type: :model do
  context "creates transfers" do
    before do
      @bank1 = Bank.create(name: "Bank A")
      @bank2 = Bank.create(name: "Bank B")
      @account1 = Account.create(holder: "Jim", bank: @bank1, funds: 25000)
      @account2 = Account.create(holder: "Emma", bank: @bank2, funds: 2000)
      @account3 = Account.create(holder: "Todd", bank: @bank1, funds: 5500)
    end

    it "between accounts, same entity" do
      Transfer.create(account: @account1, bank: @account1.bank, recipient: @account3.id, ammount: 2000)
      expect(Transfer.all.count).to eq(1)
      expect(Transfer.last.ammount).to eq(2000)
      expect(Transfer.last.account.funds).to eq(23000)
      expect(Account.find(Transfer.last.recipient).funds).to eq(7500)
    end

    it "between accounts, different entities, over limit" do
      Transfer.create(account: @account1, bank: @account1.bank, recipient: @account2.id, ammount: 1001)
      expect(Transfer.all.count).to eq(0)
    end

    it "between accounts, different entities, charge a fee" do
      Transfer.create(account: @account1, bank: @account1.bank, recipient: @account2.id, ammount: 999)
      expect(Transfer.all.count).to eq(1)
    end
  end
end

及相关型号:

class Transfer < ActiveRecord::Base
  belongs_to :account
  belongs_to :bank

  before_save :bank_validator?

  validates :ammount, numericality: { less_than_or_equal_to: 1000 }, unless: :bank_validator?

  after_save :discount_from_origin
  after_save :add_to_recipient

  def discount_from_origin
    last_transfer = Transfer.last
    Account.discount_from_origin(last_transfer.account_id, last_transfer.ammount)
  end

  def add_to_recipient
    last_transfer = Transfer.last
    Account.add_to_recipient(last_transfer.recipient, last_transfer.ammount)
  end

  def bank_validator?
    bank_id == Bank.find(Account.find(recipient).bank_id)[:id]
  end
end

前两个测试通过,第三个失败,甚至数量小于验证的 1000 限制。

欢迎任何帮助。提前致谢

【问题讨论】:

    标签: ruby-on-rails validation activerecord rspec-rails


    【解决方案1】:

    最后,只需要删除 before_save 验证。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多