Mongoid和Rails重叠日期范围

时间:2013-03-18 20:23:02

标签: ruby-on-rails ruby mongoid

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

例如: Date1 = 04/01/2013 Date2 = 04/15/2013

返回放置在该范围内的所有预订。但是,如果预订已经完成,比如2013年3月15日至2013年5月4日我也需要它来返回该结果。

这是我当前的查询:

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})

2 个答案:

答案 0 :(得分: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 :(得分:1)

您要使用的算法是:

( start1 <= end2 and start2 <= end1 )