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

时间:2011-04-12 20:06:20

标签: ruby-on-rails

我有一个名为Calendar的模型。

将应用于它的验证与用户所做的选择不同。

我知道我可以使用自定义验证+条件验证来执行此操作,但对我来说看起来不太干净。

我想知道我是否可以将它存储在数据库列中并将其传递给“通用”验证器方法。

您怎么看?

进一步解释:

用户有日历 有权访问此日历的其他用户可以安排约会。

要安排约会,应用程序应根据日历所有者定义的规则进行验证。

有很多组合,所以我得到的是:

为每个可能的验证创建自定义验证器类,然后生成条件。

class Calendar
  validate_allowed_in_hollydays :appointment_date if :allowedinhollydays?
  (tenths of other cases)
  ...
end

这有效,但感觉不对。

我正在考虑存储哪些规则应该应用于该日历,然后执行以下操作:

validate_stored_rules :appointment_date

3 个答案:

答案 0 :(得分:1)

将数据保存在数据库中然后验证它似乎有点倒退。

我认为您最初考虑使用自定义验证是最好的选择。 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 Validation Guide

取消

答案 1 :(得分:0)

你应该使用with_options它允许将默认选项放入你的代码中:

class User < ActiveRecord::Base
  with_options :if => :is_admin do |admin|
    admin.validates_length_of :password, :minimum => 10
  end
end
示例is_admin中的

可能是数据库列,attr_accessor或方法

答案 2 :(得分:0)

谢谢大家的帮助。

我的工作方式如下:

def after_initialize        
  singleton = class << self; self; end

  validations = eval(calendar.cofig)

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