2016-12-22 3 views
0

У меня есть модель слишком много пользовательские проверки.Я использовал слишком много пользовательских валидаций в модели?

Я не знаю, хорошо ли использовать пользовательские проверки таким образом?

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) запустит DB запросы. Так что я удивляюсь, что это правильный способ сделать эти проверки? Если нет, я должен создать метод 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 

ответ

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