Валидатор сравнения в Rails 7

Сравнение с другим значением, proc или атрибутом.

Валидаторы ActiveRecord являются наиболее широко используемой и известной функциональностью в Rails. Она предоставляет полный механизм валидации для проверки состояния объекта перед его сохранением в базе данных. Существуют различные валидаторы ActiveRecord, такие как presence , uniqueness , length и так далее…

Если у вас есть сценарий проверки атрибута с некоторым значением, в старых версиях Rails нам приходилось писать свои собственные валидаторы для этого. Однако в Rails 7 теперь добавлен ComparisonValidtor. Он предоставляет нам простой способ проверки сравнения между двумя сравниваемыми значениями. Этот валидатор требует опцию[value, proc или symbol] для сравнения.

Предположим, у нас есть модель назначения, в которой есть атрибуты start_date и end_date, а также другие.

До появления
Если нужно было проверить атрибут end_date на любое предоставленное значение или другой атрибут, приходилось писать пользовательскую проверку, как показано ниже:

class Appointment < ApplicationRecord

  validates :start_date, presence: true
  validates :end_date, presence: true
  validate :end_date_is_after_start_date
  def end_date_is_after_start_date
    if end_date < start_date
      errors.add(:end_date, 'can not be before the start 
                 date')
    end
  end
end
Вход в полноэкранный режим Выйти из полноэкранного режима

С Rails 7
Вам не нужно использовать пользовательскую валидацию, и на помощь приходит ComparisonValidtor. Давайте перепишем с использованием сравнения

class Appointment < ApplicationRecord
  validates :start_date, presence: true
  validates :end_date, presence: true
  validates :end_date, comparison: { greater_than: :start_date }
  # OR
  validates_comparison_of :end_date, greater_than: :start_date
end

Войти в полноэкранный режим Выйти из полноэкранного режима

ComparisonValidator обеспечивает поддержку нижеупомянутых опций:

  • greater_than : Указывает, что значение должно быть больше, чем предоставленное значение. Сообщение об ошибке по умолчанию будет «must be greater than %{value}».

  • greater_than_or_equal_to : Указывает, что значение должно быть больше или равно заданному значению. Сообщение об ошибке по умолчанию: «должно быть больше или равно %{значение}».

  • equals_to : Указывает, что значение должно быть равно заданному значению.

  • less_than : Указывает, что значение должно быть меньше заданного.

  • less_than_or_equal_to : Указывает, что значение должно быть меньше или равно заданному значению.

  • other_than : Указывает, что значение должно быть отличным от заданного. Сообщение об ошибке по умолчанию: «должно быть отличным от %{значения}».

Можно ли объединить несколько вариантов сравнения?
Да, безусловно! Мы можем комбинировать несколько вариантов сравнения.

Допустим, дата конца_даты должна быть больше даты начала_даты, а также необходимо проверить, что дата конца_даты не сегодня.

class Appointment < ApplicationRecord
  validates :start_date, presence: true
  validates :end_date, presence: true
  validates_comparison_of :end_date, greater_than: 
   :start_date, other_than: Date.today
end
Войти в полноэкранный режим Выход из полноэкранного режима

ComparisonValidator предназначен только для сравнения дат?
Абсолютно нет, с помощью ComparisonValidator можно сравнивать числовые, дату, а также строковые значения.

class Author < ApplicationRecord
   validates_comparison_of :books_count, greater_than: 5
end
Вход в полноэкранный режим Выход из полноэкранного режима

ComparisonValidator — это, безусловно, отличное дополнение к Rails 7. Поскольку он позволяет нам сравнивать данные без необходимости писать пользовательские валидации и проверяет данные без особых усилий.

Счастливого кодинга!!!❤️

Оцените статью
devanswers.ru
Добавить комментарий