Одиночное событие с гемом 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
Для того, что вы делаете, вы можете попробовать один из двух подходов:
- Одно-месячное вхождение
- Ежедневное происшествие, которое заканчивается через месяц
Это зависит от того, как вам нужно отображать или проверять время по расписанию. Вот пример обоих:
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