4

ここで見落とされている単純な何かがあるに違いありません...

IceCube基本的なスケジュールを作成するためのさまざまな方法を試してきました( https://github.com/seejohnrun/ice_cube)。全体的な目標はIceCube、「部屋の予約」Railsアプリケーション内で「価格表」を許可するために使用することです。

最初のシナリオはschedule、特定のstart_time、およびend_time-が1回だけ発生する基本を作成することです。IceCubeこれを行うことができますか?

スケジュールはで始まり、start_timeで終わりend_timeます。このスケジュールの日時を確認してoccurs_on?、部屋代を調整する必要があるかどうかを判断できると思います。

そのため、コンソールで基本的なスケジュールを作成しようとしましたが、 isとisである5.daysため、これから実行されると予想されます。しかし、それは決して真に戻らないようです...start_timeTime.nowend_timeTime.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 

繰り返しルールの追加

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>] 

次に、チェックDate.todayが機能します...

1.8.7 :025 > schedule.occurs_on? Date.today
 => true 

しかし、occurses_onをチェックしますか?forはDate.today + 10.daysまだfalseを返します...なぜですか?

1.8.7 :026 > schedule.occurs_on? Date.today + 10.days
 => false 

それで、私は何を見落としている/間違っているのですか?IceCube::Schedule start_timeまたは、とを設定するポイントは何end_timeですか?それらは効果がないようです...?

IceCube開始時刻と終了時刻のある単一発生イベントでは機能しませんか?

別のシナリオ例では、部屋の所有者がホリデーシーズンに部屋の価格を上げることを望んでいます。そのため、部屋の所有者は、2012年12月1日から2013年1月7日までの料金表を作成します(繰り返す必要はありません、所有者が希望する場合は可能です)。

その後、人々が部屋を検索しているときに、要求された滞在occurs_on?が休日の価格スケジュールである場合、価格が調整されます

スケジュール外を保存しstart_timeend_time手動で確認する必要がありますか?

または、この種のスケジュール管理を支援するためのより適した宝石/ツールはありますか?

4

2 に答える 2

8

スケジュールとルールの仕組みを誤解しています。

まず、理解することが重要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

次に、 とend_time連携してオカレンスstart_timeの期間を設定します。したがって、開始時間が 09:00 で終了時間が 17:00 の場合、各オカレンスの期間は 8 時間になります。

これにより、 と が区別されoccurs_at?(t1)ますoccurring_at?(t1)。最初のものは、指定された時間が発生の開始と正確に一致する場合にのみ真になります。2 つ目は、期間中の任意の時間に当てはまります。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

あなたがしていることについては、次の 2 つのアプローチのいずれかを試すことができます。

  1. 1 か月にわたる出来事
  2. 1 か月後に終了する毎日の出来事

これは、スケジュールに対して時間を表示または検証する方法によって異なります。両方の例を次に示します。

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)
于 2013-05-17T07:57:57.613 に答える
1

さらにテストを行った後、IceCubeのSingleOccurrenceRuleを使用することが、イベントを1回発生させる適切な方法だと思います。

start_timeスケジュールとスケジュールの間の日にのみ発生するスケジュールを作成するにはend_time、次のようなことができます。

IceCube::Schedulestartとend_timeを使用してを作成します。

1.8.7 :097 > schedule = IceCube::Schedule.new(Time.now, :end_time => Time.now + 30.days)
 => #<IceCube::Schedule:0xb63caabc @all_recurrence_rules=[], @duration=nil, @end_time=Wed Jan 09 00:03:36 -0600 2013, @all_exception_rules=[], @start_time=Mon Dec 10 00:03:36 -0600 2012> 

スケジュール内で発生するすべての日を配列に入れます。

1.8.7 :098 > days_in_schedule = []
 => [] 
1.8.7 :099 > schedule.start_time.to_date.upto(schedule.end_time.to_date) { |d| puts d; days_in_schedule << d }

配列を反復処理し、スケジュールの各日にSingleOccurrenceRuleを作成します。次に、いくつかの日付をテストします。30日以内にoccurs_on?本当です、30日以外で、occurs_on?は偽です。かどうかをチェックするときにfalseを返すことを除いて、これは正しいようですschedule.occurs_on? Date.todayどうして?!?!?

1.8.7 :100 > days_in_schedule.each { |d| schedule.rtime Time.parse(d.to_s) }
1.8.7 :109 > schedule.terminating?
 => true 
1.8.7 :110 > schedule.occurs_on? Date.today + 5.days
 => true 
1.8.7 :111 > schedule.occurs_on? Date.today + 55.days
 => false 
1.8.7 :135 > schedule.occurs_on? Date.today
 => false 
于 2012-12-10T06:18:20.320 に答える