【发布时间】:2012-07-15 04:46:41
【问题描述】:
我有一个 Contribution 和 Reward 模型。一个贡献belongs_to一个奖励。我希望贡献只有其金额大于其奖励的minimum_contribution 才有效。
所以我有
Class Contribution < ActiveRecord::Base
attr_accessible :reward_id, :reward
belongs_to :reward
validates_presence_of :amount
validates_numericality_of :amount, greater_than: 0
validates_presence_of :reward
validates_each :amount, unless: SOMECONDITION do |contribution, attr, amount|
reward = contribution.reward
contribution.errors.add(attr,
"Contribution must be at least #{reward.minimum_contribution}") unless amount > reward.minimum_contribution
end
end
我的问题是什么适合SOMECONDITION。在运行此验证之前,我需要确保
- 贡献的有效值已定义(甚至是数字)。否则在
unless value > reward.minimum_contribution中比较会出错,因为您无法与 nil 进行比较 - 定义了贡献的奖励
- 贡献的奖励的 minimum_contribution 已定义且为数字
我应该在 SOMECONDITION 的 lambda 中做这一切吗?有这么多守卫来进行一次验证,这让人感觉有些不对劲。我是否正确设计了这个?在我的验证中抛出异常是否正确的设计,例如,unless amount > contribution.reward.minimum_contribution 而amount 实际上是nil? (很明显,我总是希望数量是数字,但我不确定在验证中我应该有多偏执/我到底可以信任什么)
【问题讨论】:
标签: ruby-on-rails validation associations