Rails 3: Проверка уникальности модели времени в пределах временного диапазона

#ruby-on-rails #validation #time #model

#ruby-on-rails #проверка #время #Модель

Вопрос:

В моей модели есть поля start_time: time и end_time: time. Что я хочу иметь возможность сделать, так это проверить, что диапазон от start_time до end_time моей конкретной модели резервирования не перекрывается ни с какими другими резервациями.

Итак, если есть резервирование с 16:00 в среду, 2-го, не может быть другого резервирования в любое время с 16:00. Как бы я это сделал? Я не совсем уверен в том, как проверять временные диапазоны на соответствие другим кортежам start_time, end_time из других записей резервирования.

Ответ №1:

возможно, вот так:

 def intersects?(reservation)
  to = reservation.end_time
  from = reservation.start_time
  Reservation.where('start_time > ? OR end_time < ?', to, from).count > 0
end
  

Комментарии:

1. Это не работает при резервировании между датами в прошлом и будущем.

2. Я думаю, что это так. Можете ли вы привести пример?

3. Если у вас есть резервирование на период с 12:00 до 13:00 и одно на период с 15:00 до 16:00 и вы хотите зарезервировать резервирование на 14:00 — 15:00. где (‘start_time > 14:00 ИЛИ end_time < 15:00’) будет учитываться.

4. Если я правильно понял, вы хотите вернуть все оговорки, которые пересекаются с заданным? Потому что в предоставленном вами сценарии мое решение не возвращало бы никаких результатов (count == 0, значит, пересекается? вернет false), что должно быть правильным?

Ответ №2:

Я бы избегал validates этой конкретной потребности и просто сделал что-то более похожее

 before_save :time_check

def time_check
   if #time in range
      #reject
   else
      #accept!
end
  

или что-то в этом роде, вам нужна помощь с фактической проверкой времени?
Просто помните, что вы можете добавить секунды к объекту time Time.now (60*60)*hours , чтобы получить диапазон с < and > tests

Комментарии:

1. Я просто не уверен, как сверить мое время со временем в других записях. Под этим я подразумеваю, что если у меня есть запись, которая имеет начало x и конец y, как я узнаю, что это за x и y? В принципе, как мне написать свой метод для проверки всех записей в моей таблице резервирования?