Прежде всего измените эти столбцы на типы даты и времени, чтобы вы могли использовать функции даты в базах данных.Зачем использовать целые числа, если ваша база данных действительно может правильно представлять время / дату?
В SQL есть ключевое слово OVERLAPS
, которое можно использовать для проверки перекрытий между двумя временными метками:
SELECT "appointments".* FROM "appointments"
WHERE ((start_time, end_time) OVERLAPS (a, b))
Postgres поддерживаетЭто.MySQL, являющийся крестьянской базой данных, требует хакерского обходного пути .
. Вы можете создать "область видимости" из этого следующим образом:
class Appointment < ApplicationRecord
def self.overlapping(range)
self.where('(?,?) OVERLAPS (starts_at, ends_at)', range.begin, range.end)
end
end
Затем можно использовать область в Пользовательская проверка :
class Appointment < ApplicationRecord
validates :time_available
def self.overlapping(range)
self.where('(?,?) OVERLAPS (starts_at, ends_at)', range.begin, range.end)
end
def time_available
if self.class.overlapping(start_time..end_time).exists?
errors.add(:base, "time is not available")
end
end
end