2016-05-28 2 views
0

У меня есть следующий запрос AR, который возвращает массив номеров (комнаты, которые не доступны в отведенный срок):Активная запись получить все инстанции, которые не соответствуют условию

rooms = Room.joins(:bookings).where("(bookings.start_date >= ? AND bookings.start_date <= ?) OR (bookings.end_date >= ? AND bookings.end_date <= ?) OR (bookings.start_date <= ? AND bookings.end_date >= ?)", from, to, from, to, from, to) 

Я хочу изменить это запрос, чтобы он возвращал все остальные комнаты; то есть те, которые доступны в запрошенный период времени. Правильный результат представлен следующим образом:

all_rooms = Room.all 
available_rooms = all_rooms - rooms 

Но я прямо хочу получить доступные номера по одному запросу. Я уже добавил .Нет, но он не дает мне правильный результат:

Как мне изменить запрос?

ответ

1

Скажем:

A = (bookings.start_date >= ? AND bookings.start_date <= ?) 
B = (bookings.end_date >= ? AND bookings.end_date <= ?) 
C = (bookings.start_date <= ? AND bookings.end_date >= ?) 
first_logic = A or B or C 
second_logic = not(first_logic) = not(A or B or C) = not(A) and not(B) and not(C) 

available_rooms является условием second_logic, так что это будет так:

available_rooms = Room.joins(:bookings) 
         .where.not("bookings.start_date >= ? AND bookings.start_date <= ?", from, to) 
         .where.not("bookings.end_date >= ? AND bookings.end_date <= ?", from, to) 
         .where.not("bookings.start_date <= ? AND bookings.end_date >= ?", from, to) 

 Смежные вопросы

  • Нет связанных вопросов^_^