如何在n条件下在ActiveRecord中进行条件验证?

时间:2009-02-25 09:14:49

标签: ruby-on-rails validation activerecord

我正在提供外部公司调用的Web服务。所需的数据涵盖了几个模型,包括人员,地址等。我想根据请求中的某些字段有条件地验证接收的数据。我最终会有许多不同的验证数据集,虽然目前我只有一个,我即将添加第二个。

我当前的模型看起来像这样

class Person < ActiveRecord::Base
    validates_length_of :first_name, :within => 1..32, :allow_blank => true
    ...
    ...
end

从概念上讲,我的模型现在需要做这样的事情。

class Person < ActiveRecord::Base
    validate :first_name?  

    def first_name?
        if country == 'UK'
            if company_name == 'ABC'
                validates_length_of :first_name, :within => 1..32
            else if company_name == 'DEF'
                validates_length_of :first_name, :within => 2..20
            end
        else if country == 'DE'
             if company_name == 'ABC'
                validates_length_of :first_name, :within => 1..32
            else if company_name == 'DEF'
                validates_length_of :first_name, :within => 2..20
            end
    end
end

这显然适用于2个公司/国家,但随着公司和/或国家数量的增加,效果不佳。我现在正在考虑将验证数据保存在数据库或YAML文件中,然后根据模型外部存储的最小,最大格式值为每个字段手动执行验证。

我想我可以将验证数据存储在类似于以下

的结构中
country: UK
    companyname: ABC  
        field: first_name  
            minimum_length: 2  
            maximum_length: 20  
            required: true  
        field: middle_name  
            minimum_length: 1  
            maximum_length: 10  
        field: email_address  
            minimum_length: 10  
            format: /someregexforemail addresses/

    companyname: DEF
        field
           ...
country: DE
    companyname: XYZ
       field: 
         ....  

等等。

然后我可以加载此验证数据并在我自己的手动验证器中使用它。

过去有没有人做过类似的事情,你使用了什么方法?我特别想知道你是如何接触以下内容的。

  • 您在哪里存储配置数据,即DB或YAML?
  • 您是否为每个请求加载和解析配置数据,或者在加载服务器时加载一次?
  • 您是如何构建进行验证的实际方法的?

1 个答案:

答案 0 :(得分:1)

我用电话号码做了类似的事情。你的方法与我自己做的很相似。回答你的问题:

  1. 我将验证配置存储在YAML文件中。 Hovewer,如果您的数据将在很大程度上增长,您应该考虑使用数据库。
  2. 我在每个请求上加载和解析数据。我不认为这是最好的方法,并计划重写这部分。
  3. 我写了自己的验证。你可以得到如何做到这一点here
  4. 这对你有帮助吗?