2009-04-17 81 views
0

我需要根据模型中的某个字段对Rails中的模型进行条件验证。这是earlier question的后续行动,它促使开发出一种感觉不正确的解决方案。ActiveRecord中的条件验证

我有很多ActiveRecord模型都是基于'Order Model',其缩写版本如下所示。

class Order < ActiveRecord::Base 

    has_many: previous_addresses 
    has_one: applicant 
    has_one: current_address 
end 

所有其他型号属于订单。

我希望根据订单的公司属性对申请人,current_address等各种模式进行不同的验证。

我已经开发了一个解决方案,涉及一个完整的手动验证套件,支持所有标准activeRecord验证器。这个解决方案是用许多表格来开发的,例如模型,字段,field_items等,它们描述了验证并且相当于很多数据。

我现在必须处理这些数据,并为每个连接到的新公司进行复制和编辑。这是乏味和容易出错的。

虽然在阅读'The Rails Way'时,我发现Obie Fernandez描述了如何将验证代码以ActiveRecord验证语句的形式保存在数据库中,并在运行时根据公司id的值将其注入到模型中。

我想象在表保存数据,如下列: -

 
company: 200 
model: person 
Code validates_length_of :middle_name, :maximum => 20, :allow_nil => true 

company: 201 
model: person 
Code validates_length_of :middle_name, :maximum => 1, :allow_nil => true 

因此,对于公司201“约翰”中间名就不能通过验证,但是这将是确定的公司200

有没有人看过这样做,如果是的话,他们有任何提示/建议如何做到这一点,甚至更好没有任何人链接到教程/代码这样做?

回答

1

这听起来像你需要的是能够分别验证每个记录。如果这是真的,那么你可以使用validates_each。在此块中,您可以传递逻辑来评估模型的成员。

validates_each :middle_name do |record, attr, value| 
    if record.company == 201 
    record.errors.add attr, 'cannot be more than 1 character' if value.length > 1 
    elsif record.company == 200 
    record.errors.add attr, 'must be less than 20 characters' if value.length > 1 
    end 
end 
+0

这无疑会起作用,但我试图避免随着公司数量增长而导致的巨大ifs连锁。这个想法是为每个公司的数据库添加验证代码,而不是将它们全部列在模型中。这应该会使维护更容易 – 2009-04-18 07:05:49