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