2016-05-28 3 views
0

に一致しないすべてのインスタンスを取得しますそのクエリは他のすべての部屋を返します。これは、要求された期間内に利用可能なものです。正しい結果は次のとおりです:アクティブレコードが、私は部屋の配列(特定の期間に利用できない部屋)を返し、次のARクエリを持っている状態

all_rooms = Room.all 
available_rooms = all_rooms - rooms 

しかし、私は直接利用可能な部屋を1つのクエリで取得したいと考えています。私はすでに.notを追加しましたが、正しい結果を得られません。

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) 

どのようにクエリを変更すればよいですか?

答えて

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_roomssecond_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) 
関連する問題