0

我有一个ContributionReward模型。一份贡献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。在运行此验证之前,我需要确保

  1. 贡献的有效定义(甚至是数字)。否则比较 inunless value > reward.minimum_contribution会出错,因为你不能与 nil 比较
  2. 贡献的奖励被定义
  3. 贡献的奖励的 minimum_contribution 已定义且为数字

我应该在 lambda 中做这一切SOMECONDITION吗?有这么多守卫来进行一次验证,这让人感觉有些不对劲。我是否正确设计了这个?在我的验证中抛出异常是否正确的设计,例如,实际上是什么unless amount > contribution.reward.minimum_contribution时候?(显然,我总是希望数量是数字,但我不确定我在验证中应该有多偏执/我到底可以信任什么)amountnil

4

1 回答 1

1

您可以替换validates_each :amount为:

...
validate :validate_mininum_amount

def validate_mininum_amount
  errors.add :amount, "some error message" if amount.to_i < reward.min_contribution
end
...

注意:添加.to_i可确保金额0nil. 或者,您可以为 nil 添加特定检查。在方法中添加您需要的任何其他检查validate_mininum_amount

于 2012-07-15T05:23:10.793 回答