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

如何在带有n个条件的ActiveRecord中进行条件验证?

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

    我提供一个外部公司调用的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
    

    这显然对两个公司/国家都有效,但随着公司和/或国家数量的增加,效果不佳。我现在正在考虑将验证数据保存在数据库或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 回复  |  直到 15 年前
        1
  •  1
  •   Milan Novota    15 年前

    我用电话号码做了类似的事情。你的方法和我自己的方法非常相似。要回答您的问题:

    1. 我将验证配置存储在一个yaml文件中。如果你的数据将在很大程度上增长,你应该考虑使用数据库。
    2. 我在每个请求上加载和分析数据。我不认为这是最好的方法,尽管计划重写这部分。
    3. 我写了自己的验证。你可以来看看怎么做 here .

    这对你有帮助吗?