1

我正在做一个为特定属性放置“预订”的项目。为了防止属性被重复预订,我试图返回在给定时间范围内不可用的属性的结果。在我的预订模型中,我有 :check_in 和 :check_out 日期字段。我当前的查询仅返回包含给定范围的日期。

例如:日期 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})
4

2 回答 2

1

您要使用的算法是:

( start1 <= end2 and start2 <= end1 )
于 2014-02-21T18:49:34.280 回答
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})
于 2013-03-19T05:18:49.403 回答