我有一个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
。在运行此验证之前,我需要确保
- 贡献的有效定义(甚至是数字)。否则比较 in
unless value > reward.minimum_contribution
会出错,因为你不能与 nil 比较 - 贡献的奖励被定义
- 贡献的奖励的 minimum_contribution 已定义且为数字
我应该在 lambda 中做这一切SOMECONDITION
吗?有这么多守卫来进行一次验证,这让人感觉有些不对劲。我是否正确设计了这个?在我的验证中抛出异常是否正确的设计,例如,实际上是什么unless amount > contribution.reward.minimum_contribution
时候?(显然,我总是希望数量是数字,但我不确定我在验证中应该有多偏执/我到底可以信任什么)amount
nil