我在模型中使用了太多的自定义验证吗?

时间:2016-12-22 07:11:51

标签: ruby-on-rails validation activerecord

我的模型使用了太多自定义验证

  

我不知道以这种方式使用自定义验证是一件好事吗?

class Lesson
  validates :start_time, presence: true
  validates :end_time, presence: true
  # other validates use rails builtin

  validate :time_range_not_overlap_with_lessons_of_same_class
  validate :time_range_not_overlap_with_lessons_of_same_teacher
  validate :time_range_not_overlap_with_awj_lessons_of_same_teacher
  validate :is_conflict_with_students_cls_lessons
  validate :not_conflict_with_awj_lessons_of_students
end

我的自定义验证(如time_range_not_overlap_with_lessons_of_same_teacher)将触发数据库查询。 所以我想知道这是一种正确的方法来进行这些验证吗? 如果不是,我应该创建一个validate_params方法来替换那些自定义验证,并在每次保存记录之前调用,如下面的代码,还是有更好的方法来做到这一点?

def validate_params
   time_range_not_overlap_with_lessons_of_same_class
   # other codes here
end
if lesson.validate_params
  if lesson.save
    #do something
  else
    #other logic here
  end
end

1 个答案:

答案 0 :(得分:0)

我相信当你需要验证Active Model提供的那些内置验证器时,自定义验证并不是一个坏主意。

实现这一目标的一种简洁方法是将所有自定义验证程序提取到继承自ActiveModel::Validator的单独验证程序类。

参考:http://guides.rubyonrails.org/active_record_validations.html#performing-custom-validations

class MyValidator < ActiveModel::Validator
  def validate(record)
    #your validations
  end 
end

#custom validator added to your model
class Lesson < ActiveRecord::Base
 include ActiveModel::Validations
 validates_with MyValidator
end