在Rails中使用多个时间范围

时间:2014-02-12 06:09:12

标签: ruby-on-rails ruby-on-rails-3

约会系统:许多会议室在特定日期内预订,我需要构建建议三个30分钟空闲时间的代码对那些房间的任何用户。

每个booking都有start_timeend_time

所以,在这一天的早上8点到下午6点之间,我需要收集所有bookings,隔离这些预订范围之间的时间,然后随机选择其中三个空闲时间。有点像...

@bookings = Booking.where("room_id IN (?)", @rooms.collect(&:id))
@busy_times = @bookings.collect{|b| b.start_time..b.end_time}
@empty_times = (@day.end_time - @day.start_time) - @busy_times # so to speak

一般来说,我可以为这类问题做必要的编码,但我真的不知道如何有效地处理多个时间范围。

1 个答案:

答案 0 :(得分:0)

我不确定是否有任何现有的库方法可以做到这一点。如果我实现该功能,我可以按照以下步骤执行此操作。

  1. 获取图书后,将开始和结束时间转换为纪元时间戳。

  2. 按开始时间对预订时间范围进行排序,将每个开始和结束时间戳记放入已排序序列中的数组。数组的每个元素都是 [timestamp,flag] 。标志可以是:开始:结束

  3. 遍历数组。使用计数器,例如计数。如果遇到一个标志是:start,count ++,如果flag是:end,那么count--。然后,如果在a:end标志之后count == 0,则直到next:start,此时隙是空闲的。如果时隙> 30×60,将时隙放入数组,例如free_time_slot_array。

  4. 同时检查从早上8点到第一个预订开始时间和最后一个预订结束时间到下午6点的时间,如果时间间隔>>,则转到free_time_slot_array。 60 * 30.

  5. 从free_time_slot_array中随机选择三个时段并转换回日期时间。

  6. 希望它能为你效劳。