关于“动态”模型validation的建议

我有一个名为Calendar的模型。

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

我知道我可以使用自定义validation+条件validation来做到这一点,但对我来说看起来不太干净。

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

你怎么看?

进一步解释:

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

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

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

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

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

这有效,但感觉不对。

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

 validate_stored_rules :appointment_date 

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

我认为你最初考虑进行一些自定义validation是最好的选择。 validates_with看起来是您最好的选择。 然后,您可以创建一个单独的类并在其中构建所有validation,以使其与主模型分离。

 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 

代码直接从Railsvalidation指南中解除

你应该使用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或方法

感谢大家的帮助。

我有这样的工作方式:

 def after_initialize singleton = class << self; self; end validations = eval(calendar.cofig) validations.each do |val| singleton.class_eval(val) end end