我正在开展一个为特定房产进行“预订”的项目。为了防止属性被双重预订,我试图返回在给定时间范围内不可用的属性的结果。在我的预订模型中,我有: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})
答案 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 )