【问题标题】:Conditional validation in ActiveRecordActiveRecord 中的条件验证
【发布时间】:2009-04-17 17:01:14
【问题描述】:

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

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

class Order < ActiveRecord::Base

  has_many: previous_addresses
  has_one: applicant
  has_one: current_address
end

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

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

我为此开发了一个解决方案,其中涉及一个完整的手动验证套件,支持所有标准的 activeRecord 验证器。该解决方案是使用许多表(例如模型、字段、field_items 等)开发的,这些表描述了验证并包含大量数据。

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

在阅读“The Rails Way”时,我发现 Obie Fernandez 描述了将验证代码以 ActiveRecord 验证语句的形式保存在数据库中并在运行时根据公司 ID 的值将这些代码注入模型的部分。

我想将数据保存在如下表中:-

公司:200 型号:人 代码 validates_length_of :middle_name, :maximum => 20, :allow_nil => true 公司:201 型号:人 代码 validates_length_of :middle_name, :maximum => 1, :allow_nil => true

因此,对于公司 201,中间名“John”将无法通过验证,但对于公司 200 则可以。

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

【问题讨论】:

    标签: ruby-on-rails validation activerecord


    【解决方案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
    

    【讨论】:

    • 这无疑会奏效,但我试图避免随着公司数量的增长而导致的巨大的 ifs 链。这个想法是将验证代码添加到每个公司的数据库中,而不是在模型中将它们全部列出。这应该使维护更容易
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 2022-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多