2011-06-11 119 views
0

我有一个模型,Offer,属于User。用户有一个属性:prepaid_amount,表示金额,而:bid_total是项目上所有金额的总和乘以每个出价的数量。因此,有两份标书,一个与quantity => 3amount => 10,另一个与quantity => 2amount => 3用户,有36rails 3关系验证

如果prepaid_amount是大于这个值的bid_total,一切都很好。假设prepaid_amount为40.

如果我想验证用户的新出价quantity => 1,那么出价金额可以是大于0且大于4的任何整数。如果它为零,则1 * 0,并且验证应该失败,因为出价必须大于零。如果金额是(比如说)5,则出价不应该被验证,因为36 + 1 * 5 = 41,这大于prepaid_amount

如何在Offer模型中的Rails 3中创建这样的验证?这是我有什么,这是行不通的:

class Offer < ActiveRecord::Base 

    belongs_to :user 

    validates :user_id, :presence => true, :numericality => true do 
    validates :qty, :presence => {:if => Proc.new { |offer| (offer.user.prepaid_amount-offer.user.bid_total)/offer.amount >= offer.qty} } 
    end 


end 

回答

0

你有没有考虑过使用自定义验证方法?

validates_with :my_custom_validation_method 

def my_custom_validation_method 
    ...your code to validate... 
end 

可能有人会说,这不是验证的完美轨的方式,但如果您的验证是如此复杂,你可能会考虑在自己的方法隔离。

+0

我想这是我的下一步,如果它解决了这个问题。不知道我看到了我想要做的那些复杂的事情......但我会给它一个机会。 – 2011-06-13 13:08:31

+0

validates:qty,:numericality => {:less_than => Proc.new {| offer | (offer.user.prepaid_amount-offer.user.bid_total)/offer.amount}}会做到这一点...... – 2011-06-13 15:34:08

+0

复杂的我只是说它已经成为尝试使用内置验证将各种验证部件焊接在一起的练习工具。 – jaydel 2011-06-13 23:27:17