【问题标题】:How do I do conditional validation in ActiveRecord with n conditions?如何在具有 n 个条件的 ActiveRecord 中进行条件验证?
【发布时间】:2009-02-25 09:14:48
【问题描述】:

我正在提供一个可供外部公司调用的 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 文件中,然后根据模型外部存储的最小、最大格式值手动为每个字段执行验证。

我认为我可以将验证数据存储在类似于以下的结构中

国家:英国 公司名称:ABC 字段:名字 最小长度:2 最大长度:20 要求:真 字段:中间名 最小长度:1 最大长度:10 字段:电子邮件地址 最小长度:10 格式:/someregexforemail 地址/ 公司名称:DEF 场地 ... 国家:德国 公司名称:XYZ 场地: ……

等等。

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

过去有没有人做过类似的事情,你用了什么方法?我特别想知道您是如何处理以下问题的。

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

【问题讨论】:

    标签: ruby-on-rails validation activerecord


    【解决方案1】:

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

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

    这对你有帮助吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-06
      • 2015-02-08
      • 1970-01-01
      • 1970-01-01
      • 2011-01-20
      • 2020-03-11
      • 1970-01-01
      • 2021-07-13
      相关资源
      最近更新 更多