Невозможно записать проверки для дат в Rails
Я пытаюсь проверить даты в моем приложении Rails. Я использую jQuery Datepicker, чтобы выбрать начальную и конечную дату для бронирования в библиотеке. Прежде чем создавать новое резервирование, я хочу проверить, что в БД нет других резервирований, которые бы конфликтовали с создаваемым. Кажется, что независимо от того, какие даты я выбираю, он всегда выдает ошибку "Недоступно". Это потому, что я использую Datepicker, а не стандартное поле date_field в Rails?
if Booking.where {
(book_id == self.book_id) &
(((from <= self.from) & (to >= self.from)) |
((from >= self.from) & (to <= self.to)) |
((from >= self.from) & (from < self.to) & (to >= self.to)))
}.any?
errors.add(:from, "Not available")
end
Я также попробовал:
def uniqueness_of_date_range
errors.add(:from, "is not available") unless Booking.where { (from >= self.from) & (from <= self.to) }.count == 0
errors.add(:to, "is not available") unless Booking.where { (to >= self.from) & (to <= self.to) }.count == 0
end
Я использую самоцвет Squeel. Я также экспериментировал с SQL, как с массивами, так и с хэш-синтаксисом, но он дает мне ошибки в синтаксисе (даже если он проверен дважды, 100% правильно).
Booking.where { (from >= self.from) & (from <= self.to) }
и все другие испытания возвращают мне даже записи, которые не должны быть возвращены.
Когда я использую
Booking.where { (from >= self.from) & (from <= self.to) }.pluck(:from).first
и сравните это с моим self.from, оно показывает правильные ответы.
1 ответ
Я предполагаю, что ваше ограничение даты не работает так, как вы хотели.
Посмотрите, работает ли это:
Booking.where {
(existing_booking.book_id == new_booking.book_id) &
(((existing_booking.to >= new_booking.from) & (existing_booking.to <= new_booking.to)) |
((existing_booking.from <= new_booking.to) & (existing_booking.from >= new_booking.from)))
}
В основном это проверка
- Есть ли запись бронирования для идентичных
book_id
- Есть ли запись бронирования которых
to
между новым бронированиемfrom
а такжеto
- Есть ли запись бронирования которых
from
между новым бронированиемfrom
а такжеto
Честно говоря, даже если это работает, я думаю, что это создает ужасный запрос SQL... Я надеюсь, что некоторые другие могли бы добавить некоторые предложения.