约会系统:许多会议室在特定日期内预订,我需要构建建议三个30分钟空闲时间的代码对那些房间的任何用户。
每个booking
都有start_time
和end_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
一般来说,我可以为这类问题做必要的编码,但我真的不知道如何有效地处理多个时间范围。
答案 0 :(得分:0)
我不确定是否有任何现有的库方法可以做到这一点。如果我实现该功能,我可以按照以下步骤执行此操作。
获取图书后,将开始和结束时间转换为纪元时间戳。
按开始时间对预订时间范围进行排序,将每个开始和结束时间戳记放入已排序序列中的数组。数组的每个元素都是 [timestamp,flag] 。标志可以是:开始或:结束。
遍历数组。使用计数器,例如计数。如果遇到一个标志是:start,count ++,如果flag是:end,那么count--。然后,如果在a:end标志之后count == 0,则直到next:start,此时隙是空闲的。如果时隙> 30×60,将时隙放入数组,例如free_time_slot_array。
同时检查从早上8点到第一个预订开始时间和最后一个预订结束时间到下午6点的时间,如果时间间隔>>,则转到free_time_slot_array。 60 * 30.
从free_time_slot_array中随机选择三个时段并转换回日期时间。
希望它能为你效劳。