使用start_time和end_time使用ice_cube gem发生单次事件

b2t*_*ech 3 ruby ruby-on-rails-3 ice-cube

这里必须有一些简单的东西被忽视......

我一直在尝试各种方法来创建基本的IceCube时间表(https://github.com/seejohnrun/ice_cube).总体目标是使用IceCube"房间预订"rails应用程序中的"价格表".

第一种情况是创建schedule一个特定的基础start_time和end_time- 只发生一次.IceCube能做到这一点,对吗?

时间表将从start_time结束时开始end_time.我希望能够检查occurs_on?此日程表的日期或时间,以确定是否应调整房价.

因此,在控制台我试着建立一个基本的时间表,并希望它可以发生5.days从现在开始,因为start_time是Time.now和end_time是Time.now + 30.days.但它似乎永远不会真实......

1.8.7 :001 > schedule = IceCube::Schedule.new(Time.now, :end_time => Time.now + 30.days)
 => #<IceCube::Schedule:0xb619d604 @all_recurrence_rules=[], @duration=nil, @end_time=Tue Jan 08 09:13:11 -0600 2013, @all_exception_rules=[], @start_time=Sun Dec 09  09:13:11 -0600 2012> 
1.8.7 :002 > schedule.occurs_on? Date.today + 5.days
 => false 
1.8.7 :005 > schedule.occurs_at? Time.now + 5.days
 => false 
1.8.7 :006 > schedule.occurring_at? Time.now + 5.days
 => false 
Run Code Online (Sandbox Code Playgroud)

添加重复规则

1.8.7 :018 > schedule.rrule IceCube::Rule.monthly
=> [#<IceCube::MonthlyRule:0xb687a88c @validations={:base_day=>[#<IceCube::Validations::ScheduleLock::Validation:0xb6875b0c @type=:day>], :base_hour=>[#<IceCube::Validations::ScheduleLock::Validation:0xb6875abc @type=:hour>], :interval=>[#<IceCube::Validations::MonthlyInterval::Validation:0xb6875d28 @interval=1>], :base_min=>[#<IceCube::Validations::ScheduleLock::Validation:0xb6875a6c @type=:min>], :base_sec=>[#<IceCube::Validations::ScheduleLock::Validation:0xb6875a1c @type=:sec>]}, @interval=1>] 
Run Code Online (Sandbox Code Playgroud)

检查Date.today工作......

1.8.7 :025 > schedule.occurs_on? Date.today
 => true 
Run Code Online (Sandbox Code Playgroud)

但检查发生了什么?对于Date.today + 10.days仍然返回false,为什么?

1.8.7 :026 > schedule.occurs_on? Date.today + 10.days
 => false 
Run Code Online (Sandbox Code Playgroud)

那我在忽视/做错了什么?或什么是设置一个点IceCube::Schedule start_time和end_time-他们似乎没有任何效果......?

IceCube对于具有开始和结束时间的单个事件事件不起作用?

另一个示例场景,房间所有者希望在假日季节提高房价.所以房间主人将创建开始于2012年12月1日,结束01月07日2013年一个价格表(不应该有复发,但可以如果车主想要的).

然后,当人们搜索房间时,如果请求的住宿occurs_on?是假日价格表,则将调整价格

我需要存储start_time和end_time外部的时间表和手动或什么检查呢?

或者是否有更适合的宝石/工具来协助这种日程管理?

And*_*Vit 7

您误解了计划和规则的工作原理.

首先,理解是很重要的start_time.计划的每次出现都基于此,并且计划返回与开始时间的特定间隔匹配的时间.间隔由规则确定.

您的示例不起作用,因为"从现在起5天"不是从计划的开始时间开始的每月间隔.从开始时间开始的28,30或31天将匹配,具体取决于月份.

start = Time.utc(2013, 05, 17, 12, 30, 00) # 2013-05-17 12:30:00 UTC
schedule = IceCube::Schedule.new(start)
schedule.add_recurrence_rule IceCube::Rule.monthly

schedule.occurs_on? start + 5.days #=> false
schedule.occurs_on? start + 31.days #=> true
Run Code Online (Sandbox Code Playgroud)

其次,end_time与每个事件start_time的持续时间一起设定.因此,如果您的开始时间是09:00,结束时间是17:00,则每次出现的持续时间为8小时.

这在occurs_at?(t1)和之间产生了区别occurring_at?(t1):第一个仅在给定时间与事件的开始完全匹配时才为真; 第二个在持续时间的任何时间都是真的.occurs_on?(d1)在给定日期的任何时间匹配.

arrival = Time.utc(2013, 5, 1,  9, 0, 0)
departure  = Time.utc(2013, 5, 1, 17, 0, 0)
schedule = IceCube::Schedule.new(arrival, end_time: departure)
schedule.add_recurrence_rule IceCube::Rule.weekly.day(1, 2, 3, 4, 5) # M-F

schedule.occurs_at? arrival            #=> true
schedule.occurs_at? arrival + 1.second #=> false

schedule.occurring_at? arrival + 1.second   #=> true
schedule.occurring_at? departure + 1.second #=> false
Run Code Online (Sandbox Code Playgroud)

对于您正在做的事情,您可以尝试以下两种方法之一:

  1. 一个月的发生
  2. 每月发生一个月后结束

这取决于您需要如何根据计划显示或验证时间.以下是两者的示例:

arrival = Time.utc(2013, 5, 1)
departure = Time.utc(2013, 5, 31)

# single occurrence
schedule = IceCube::Schedule.new(arrival, duration: 31.days)

# daily occurrence
schedule = IceCube::Schedule.new(arrival, duration: 1.day)
schedule.add_recurrence_rule IceCube::Rule.daily.until(departure)
Run Code Online (Sandbox Code Playgroud)