2016-05-28 15 views
0

Ich habe folgende AR-Abfrage, die eine Anordnung der Zimmer (die Zimmer, die in dem Zeitraum nicht verfügbar sind gegeben) zurückgibt:Aktive Aufzeichnung alle Instanz erhalten, die Bedingung nicht übereinstimmen

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) 

Ich möchte ändern diese Abfrage, so dass es alle anderen Räume zurückgibt; das sind diejenigen, die im angeforderten Zeitraum verfügbar sind. Das richtige Ergebnis ergibt sich aus folgendem:

Aber ich möchte direkt die verfügbaren Räume in einer einzigen Abfrage bekommen. Ich habe bereits eine .not aber es tut mir das richtige Ergebnis geben:

rooms = Room.joins(:bookings).where.not("(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) 

Wie soll ich die Abfrage ändern?

Antwort

1

Sagen wir:

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 die Bedingung von second_logic ist, so wird es sein wie:

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)