2012-07-15 82 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方法中添加您需要的任何其他檢查。