2016-09-21 115 views
0

我有以下的關聯客房預訂系統查詢

User: 
    has_many :reservations 
    has_many :rooms, through: :reservations 
Room: 
    has_many :reservations 
    has_many :users, through: :reservations 
Reservation: 
    belongs_to :room 
    belongs_to :user 

在我的預約模式,我有如下領域

CHECKIN_DATE,CHECKOUT_DATE

我想找出所有的客房,在給定時間內尚未保留。

我寫下面的查詢,但它不工作。請建議更正或更好的方法。

Room.joins('LEFT JOIN reservations ON reservations.room_id = rooms.id').where.not(
     'reservations.checkin_at < :requested_end_date AND 
     reservations.checkout_at > :requested_start_date', 
     requested_start_date: date_begin, 
     requested_end_date: date_end 
    )  
+0

什麼錯誤? –

+0

@BartekGładys當沒有預訂時它將返回空,它應該返回所有房間。 – Adt

回答

0

解決方案

class Room < ActiveRecord::Base 

    has_many :reservations 
    has_many :users, through: :reservations 

    def self.find_unreserved date_begin, date_end, category 
    reserved_room_ids = Reservation.on(date_begin, date_end).pluck('DISTINCT room_id') 
    if reserved_room_ids.empty? 
     where(category: category) 
    else 
     where('id NOT IN ?', reserved_room_ids).where(category: category) 
    end 
    end 

end 

class Reservation < ActiveRecord::Base 
    belongs_to :room 
    belongs_to :user 


    scope :on, -> (checkin_date, checkout_date) {where('checkin_at > ? AND checkout_at < ?', checkin_date, checkout_date) } 
end 
0

也許......

Room.joins('left join reservations on reservations.room_id = rooms.id') 
      .where('reservations.checkin_at > ? AND reservations.checkout_at < ?', date_begin, date_end) 
      .where('reservations.room_id IS NULL') 
+0

在這種情況下,它不會顯示預訂房間,而是顯示其他日期。 – Adt

+0

範圍是錯誤的(我只是解決了這個問題......)但是沒有得到它,你想獲得與用戶無關的房間(保留)......我想我的查詢檢索到......(我猜) –

+0

我想要一段時間內沒有預訂的房間。可能有一種情況,房間預留一段時間,但在給定的時間段內可以自由使用。 – Adt