代码之家  ›  专栏  ›  技术社区  ›  Steve Weet

ActiveRecord中的条件验证

  •  0
  • Steve Weet  · 技术社区  · 15 年前

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

    我有许多ActiveRecord模型都是基于“订单模型”,其简短版本如下所示。

    class Order < ActiveRecord::Base
    
      has_many: previous_addresses
      has_one: applicant
      has_one: current_address
    end
    

    所有其他型号都属于订单。

    我希望根据订单的公司属性,不同地验证各种模型,如申请人、当前地址等。

    我已经开发了一个解决方案,其中包括一个完整的手工滚动验证套件,支持所有标准的ActiveRecord验证程序。该解决方案是用许多表(如模型、字段、字段项等)开发的,这些表描述了验证过程并包含大量数据。

    现在,我必须对这些数据进行操作,并为我所连接的每个新公司复制和编辑这些数据。这很冗长而且容易出错。

    在阅读“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公司,“john”的中间名将无法通过验证,但对于200公司来说这是可以的。

    有人看到过这样做吗?如果有,他们有关于如何做的任何提示/建议吗?更好的是,有人有任何指向这样做的教程/代码的链接吗?

    1 回复  |  直到 15 年前
        1
  •  1
  •   vrish88    15 年前

    听起来您需要的是能够分别验证每个记录。如果这是真的,那么你可以用 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