有关“动态”模型验证的建议

问题描述

| 我有一个名为
Calendar
的模型。 将应用于其的验证与用户所做的选择不同。 我知道我可以使用自定义验证+条件验证来执行此操作,但对我来说看起来并不干净。 我想知道是否可以将其存储在数据库列中并将其传递给“通用”验证器方法。 你怎么看? 进一步说明: 用户一个日历。 有权访问此日历的其他用户可以安排约会。 要安排约会,应用程序应根据日历所有者定义的规则进行验证。 有很多组合,所以我想到的是: 为每个可能的验证创建自定义验证器类,然后使其成为有条件的。
class Calendar
  validate_allowed_in_hollydays :appointment_date if :allowedinhollydays?
  (tenths of other cases)
  ...
end
这可行,但是感觉不对。 我正在考虑将某个规则应用于该日历的某个地方,然后执行以下操作:
validate_stored_rules :appointment_date
    

解决方法

将数据保存在数据库中然后进行验证似乎有些倒退。 我认为您最初考虑进行一些自定义验证是最好的选择。 validates_with看起来是您的最佳选择。然后,您可以创建一个单独的类,并在其中建立所有验证,以使其与主模型分离。
class Person < ActiveRecord::Base
  validates_with GoodnessValidator
end

class GoodnessValidator < ActiveModel::Validator
  def validate
    if record.first_name == \"Evil\"
      record.errors[:base] << \"This person is evil\"
    end
  end
end
从Rails验证指南中直接获取代码     ,您应该使用with_options,它允许将默认选项放入您的代码中:
class User < ActiveRecord::Base
  with_options :if => :is_admin do |admin|
    admin.validates_length_of :password,:minimum => 10
  end
end
在示例“ 5”中,可能是数据库列,“ 6”或方法     ,谢谢大家的帮助。 我已经像这样工作了:
def after_initialize        
  singleton = class << self; self; end

  validations = eval(calendar.cofig)

  validations.each do |val|
    singleton.class_eval(val)
  end
end