Проверьте, работает ли это:
class Booking
validate :booking_period_not_overlapped
private
def booking_period_not_overlapped
unless Booking.where(
'(booked_from <= ? AND booked_to >= ?) OR (booked_from >= ? AND booked_from <= ?)',
booked_from, booked_from,
booked_from, booked_to
).empty?
errors.add(:booked_from, 'Invalid period.')
end
end
end
Он просто проверяет, существуют ли какие-либо записи, чьи booked_from и booked_to удовлетворяют одному из следующих условий (предположим, что ваш новый заказ с 16:00 до 17:00):
- оно начинается до нового бронирования и еще не закончилось (например, 15:00 - 16:30 или 15:00 - 17:30)
- оно начинается в течение нового периода бронирования (например, 16:20 - 16:50 или 16:30 - 17:30)