2013-03-18 91 views
1

我正在開發一個項目,該項目針對某個特定的屬性進行「預訂」。爲了防止房產被雙重預訂,我試圖返回給定時間範圍內不可用房產的結果。在我的預訂模型中,我有:check_in和:check_out日期字段。我目前的查詢是返回的日期,只包含給定的範圍。Mongoid和Rails重疊日期範圍

例如: 日期1 = 2013年4月1日 日期2 = 2013年4月15日

返回放置在該範圍內的所有擔保。但是,如果進行了預訂,請說明2013年3月15日至2013年4月5日我需要它來返回該結果。

這裏是我當前的查詢:

bookings = Booking.where(check_in: {'$gte' => params[:check_in].to_date, '$lte' => params[:check_out].to_date}, check_out: {'$gte' => params[:check_in].to_date,'$lte' => params[:check_out].to_date}) 
+1

更新:我發現了一個類似的問題的活動記錄,但似乎無法讓它翻譯爲mongoid。 http://stackoverflow.com/questions/2682638/finding-records-that-overlap-a-range-in-rails – 2013-03-18 22:19:38

回答

1

我不知道這是否是最好的解決方法,但我得到了下面的查詢產生預期的結果:

bookings = current_user.organization.corporate_bookings.or(check_in: (params[:check_in].to_date..params[:check_out].to_date)).or(check_out: (params[:check_in].to_date..params[:check_out].to_date)).or(check_in: {"$lte" => params[:check_in].to_date}, check_out: {'$gte' => params[:check_out].to_date}) 
1

的算法要使用是:

(start1 <= end2 and start2 <= end1)