Коли мова йде про роботу з датами, часто потрібно порівнювати їх між собою. Наприклад, у класі Booking зазвичай є дата заїзду (check-in) та дата виїзду (check-out). У більшості випадків, при створенні бронювання, обидві дати повинні бути в майбутньому. І завжди дата виїзду повинна бути пізнішою за дату заїзду. В іншому випадку бронювання не мало б сенсу.
До 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