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

jos*_*eph 4 ruby algorithm database-design ruby-on-rails ruby-on-rails-3

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

要做到这一点,我想我会将一周划分为30分钟的时段,并为每个时段分配一个ID.然后日期范围将搜索相应的时隙ID.

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

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

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

Joe*_*own 5

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

create table BOOKING 
( rental_unit_id  int 
, start_datetime  date
, end_datetime    date
)
Run Code Online (Sandbox Code Playgroud)

现在,如果您想获得可用于整个给定时间段的租赁单元列表,请将@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 )
Run Code Online (Sandbox Code Playgroud)

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

编辑:处理多个可用性块

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