#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? В принципе, как мне написать свой метод для проверки всех записей в моей таблице резервирования?