Коли справа доходить до дат, часто виникає потреба порівнювати їх між собою. Наприклад, візьмемо клас Booking. Зазвичай у бронюванні є дата заїзду та дата виїзду. В більшості випадків, при створенні бронювання, обидві дати повинні бути в майбутньому. І завжди дата виїзду має бути пізнішою за дату заїзду. В іншому випадку, бронювання не мало б сенсу.
До Rails 7 ці валідації не існували, і нам доводилось писати власний метод валідації, як ось цей:
class Booking < ApplicationRecord
validates :check_in, presence: true
validates :check_out, presence: true
validate :check_out_is_greater_than_check_in
private def check_out_is_greater_than_check_in
unless check_out.after? check_in
errors.add :check_out, "can't be before the check in date"
end
end
end
Rails 7 представив ComparisonValidator для ActiveModel, що значно полегшує нашу роботу. Тепер ми можемо зробити ось так:
class Booking < ApplicationRecord
validates :check_in, presence: true, comparison: {greater_than: Date.today}
validates :check_out, presence: true, comparison: {greater_than: :check_in}
end
Сьогодні я дізнався про це, і мені б хотілося, щоб це було доступно кілька років тому, коли ми з командою працювали над набором додатків для готельного бізнесу. Дякую, Ruby on Rails, що ти існуєш!
Перекладено з: Long-awaited comparison validator comes to Rails 7