使用Ruby on Rails进行时间可用性比较

我希望有一个多个对象的可用性表,并进行比较。 例如,承租人将搜索租赁单位,该单位在星期一下午1-3点开始提供。

为了做到这一点,我想我会把这周分成30分钟的时间段并给每个时段一个ID。 然后日期范围将搜索相应的时隙ID。

然而,那时我需要5040条记录来跟踪每个时间段,而且我对于手动维护它并不太兴奋(在Ruby中我不知道如何去做)。 是否有一个更优雅的方法,通过使用日期时间,或一些Rails插件,将执行类似于我想要的东西,但更容易?

关键要求是它必须比较多个分开的时间块。

编辑:如果可以有一种比较多个时间块来查看最佳匹配的方法,那将是一个奖励。 例如,如果我想在星期一,星期三和星期五租用摄像机,并且一天有一台摄像机可用,而另一台摄像机只有两天可用,我希望能够对摄像机进行比较和排序。最佳匹配的基础。

您不需要拥有如此复杂的模型。 您只需要一张表格,其中显示了租赁单位不可用的时间块,换句话说,就是每个出租单位的预订时间表。 例如:

 create table BOOKING ( rental_unit_id int , start_datetime date , end_datetime date ) 

现在,如果您想获得可用于整个给定时间块的租赁单元列表,请将@Arrive称为@Depart,那么您所要做的就是运行如下查询:

 select R.rental_unit_id -- (and anything else you want) from RENTAL_UNIT R where not exists ( select B.rental_unit_id from BOOKING B where B.rental_unit_id = R.rental_unit_id and end_datetime > @Arrive and start_datetime < @Depart ) 

这个查询说给我一个租赁单位列表,其中没有预订与感兴趣的搜索周期重叠(从@Arrive到@Depart)。 请注意,您可以使用<= @Depart进行游戏,具体取决于您是否希望在预订期间拥有包容性或独占端点。

编辑:处理多个可用性块

@OP增加了对多个可用性块的要求。 如果您在多天内租用设备,那么@Arrive和@Depart就会在不同的日期发生。 如果在@ OP的例子中,多天在中间有间隙 - 可能是设备被退回并且可以租给其他人 - 那么你只需要添加额外的where not exists子句 - 每个独立的块需要一个可用性。 只需“和”它们在一起,您就会找到所有所需时间段中可用的出租单位。 更好或更差的比赛的概念并不真正适用。 租赁单元可用或不可用。

我会说你的时间段应该是以下型号:

 TimeSlot rental_id : int -> foreign key to your rental table (housing, whatever) start_time : time end_time : time day_of_week : int 1-7 

然后从两次可用性中搜索将是:(让我们称这些AVAILABLE_SLOTS)

 ( (wanted_start_time >= TimeSlotTable.start_time && wanted_start_time <= TimeSlotTable.end_time) OR (wanted_end_time >= TimeSlotTable.start_time && wanted_end_time <= TimeSlotTable.end_time) ) AND Optionally: ( wanted_day_of_week = TimeSlotTable.day_of_week) 

其中TimeSlotTable是表的名称。

然后,如果您真的希望从查询中获得更多粒度,则可以拥有exception表。 也就是说,租赁所有者指示他们是否在特定日期不可用的表格,这将要求UI除了要求时还要求日期。 (让我们称之为例外)

 ExceptionTimeSlot rental_id : int -> foreign key to your rental table (housing, whatever) date : date 

和查询:

 ( wanted_date = ExceptionTimeSlotTable.date) 

最后,您需要在AVAILABLE_TIMESLOTS中但不在EXCEPTIONS中的rental_ids。

整个事情就像一个事件日历,所以你可以拿起一个偶数日历并根据你的目的自定义它,并调用事件时间段。