Одиночное событие с гемом ice_cube с использованием start_time и end_time

Здесь должно быть что-то простое упускается из виду...

Я пробовал различные методы для создания основных IceCube расписание ( https://github.com/seejohnrun/ice_cube). Общая цель заключается в использовании IceCube разрешить "ценовые графики" в приложении "бронирование номеров".

Первый сценарий будет создавать основные 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 

Добавление правила повторения

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 

Но проверка происходит? за Date.today + 10.days все еще возвращает ложь... Почему?

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

Так что я пропускаю / делаю неправильно? Или какой смысл устанавливать IceCube::Schedule start_time а также end_time - они, кажется, не имеют никакого эффекта...?

Есть ли IceCube не работает для событий единичного вхождения с временем начала и окончания?

Другой пример сценария: владелец комнаты хочет, чтобы цены на номера были подняты в праздничный сезон. Таким образом, владелец комнаты создает график цен, который начинается 1 декабря 2012 года и заканчивается 7 января 2013 года. (Не должен повторяться, но может, если владелец хотел).

Затем, когда люди ищут номера, цены будут скорректированы, если запрошенное пребывание occurs_on? график праздничных цен

Нужно ли хранить start_time а также end_time вне графика и проверять это вручную или как?

Или есть более подходящий драгоценный камень / инструмент, чтобы помочь с этим типом управления расписанием?

2 ответа

Вы не понимаете, как работают графики и правила.

Во-первых, важно понимать 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): первое верно только тогда, когда данное время точно совпадает с началом вхождения; второй верен для любого времени в продолжительности. 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

Для того, что вы делаете, вы можете попробовать один из двух подходов:

  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)

После еще одного тестирования я думаю, что использование SingleOccurrenceRule в IceCube - это правильный способ получить единичное вхождение события.

Иметь расписание, которое происходит только в дни между расписанием start_time а также end_time Я могу сделать что-то вроде следующего.

Создать IceCube::Schedule с началом и временем окончания:

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 дней происходит_он? правда, за 30 дней, происходит_он? ложно Это кажется правильным, за исключением того, что все еще возвращает ложь при проверке, если 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 
Другие вопросы по тегам