2012-07-15 78 views
0

我有一个ContributionReward模型。奖励belongs_to。我想要一个贡献是有效的,只有它的数额大于其奖励的minimum_contributionRails 3复杂验证设计

所以我

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. 该贡献的有效性已定义(或甚至是数字)。否则,在unless value > reward.minimum_contribution比较将有一个错误,因为你无法比拟的零
  2. 定义
  3. 的贡献的奖励的minimum_contribution被定义的贡献的奖励和数字

我应该ALL在lambda做这个为SOMECONDITION?有这么多警卫进行单一验证,感觉有点不对劲。我正确地设计这个吗?是否有适当的设计在我的验证中抛出异常,例如,unless amount > contribution.reward.minimum_contributionamount实际上是nil? (很明显,我总是期待量是数字,但我不知道我应该怎么偏执在我的验证/正是我可以信任)

回答

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确保金额为0,如果它是nil。或者你可以添加一个特定的支票零。在validate_mininum_amount方法中添加您需要的任何其他检查。