Невозможно записать проверки для дат в 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)))
}

В основном это проверка

  1. Есть ли запись бронирования для идентичных book_id
  2. Есть ли запись бронирования которых to между новым бронированием from а также to
  3. Есть ли запись бронирования которых from между новым бронированием from а также to

Честно говоря, даже если это работает, я думаю, что это создает ужасный запрос SQL... Я надеюсь, что некоторые другие могли бы добавить некоторые предложения.

Другие вопросы по тегам