множественные проверки, основанные на действии с rails

#ruby-on-rails #validation

#ruby-on-rails #проверка

Вопрос:

как могут быть разные проверки в зависимости от действия?

 validates :total_pressed,
          :numericality => { :on => :create, :greater_than => 0 },
          :numericality => { :on => :update, :greater_than_or_equal_to => 100 }
  

первое числовое утверждение игнорируется

Ответ №1:

Вы можете использовать validate_on_create и validate_on_update

 def validate_on_create # is only run the first time a new object is saved
  errors.add(:total_pressed, 'invalid number') if total_pressed < 0
end

def validate_on_update
  errors.add(:total_pressed, 'invalid number') if total_pressed < 100
end
  

Ответ №2:

При проверке первого оператора numericality игнорируется, потому что это хэш, и одна вещь перезаписывает другую

Вы можете сделать это:

 validates :total_pressed, :numericality => { :on => :create, :greater_than => 0 }
validates :total_pressed, :numericality => { :on => :update, :greater_than_or_equal_to => 100 }
  

Ответ №3:

Обычно проверка выполняется как при создании, так и при обновлении (через save), поэтому, если вы передадите флаг on, вы ограничите его любым из двух методов. Если вы хотите иметь другую проверку на основе действия, то вам лучше всего использовать пользовательскую проверку.

то есть

 validate :total_pressed_on_create, :total_pressed_on_update

def total_pressed_on_create
  errors.add(:total_pressed, 'invalid number') if self < 0 and self.new_record?
end

def total_pressed_on_update
  errors.add(:total_pressed, 'invalid number') if self < 100 and !self.new_record?
end
  

Что-то в этом роде. Для получения более подробной информации ознакомьтесь с Rails Guide: Validation.