# Gemfile
gem 'ice_cube'
# event.rb
class Event < ApplicationRecord
enum occurrence: { biweekly: 0, monthly: 1, annually: 2 }
def schedule
# Not covered in the video, but in these situations,
# I'll most likely call schedule multiple times in a
# complex view, so I will use memoization for the schedule
@schedule ||= begin
schedule = IceCube::Schedule.new(now = start_date)
case occurrence
when 'biweekly'
schedule.add_recurrence_rule IceCube::Rule.weekly(2)
when 'monthly'
schedule.add_recurrence_rule IceCube::Rule.monthly(1)
when 'annually'
schedule.add_recurrence_rule IceCube::Rule.yearly(1)
end
schedule
end
end
end
# rails console
start_date = Date.new(2017,1,1)
end_date = Date.new(2017,12,31)
event = Event.create(name: '2017 Calendar', start_date: start_date, end_date: end_date)
event.schedule.occurrences(end_date)
event.schedule
=> #[#], :base_wday=>[#], :base_hour=>[#], :base_min=>[#], :base_sec=>[#]}, @interval=2, @week_start=:sunday, @time=nil, @start_time=nil, @uses=0>], @all_exception_rules=[]>
event.schedule.occurrences(end_date)
=> [2017-01-01 00:00:00 -0500, 2017-01-15 00:00:00 -0500, 2017-01-29 00:00:00 -0500, 2017-02-12 00:00:00 -0500, 2017-02-26 00:00:00 -0500, 2017-03-12 00:00:00 -0500, 2017-03-26 00:00:00 -0400, 2017-04-09 00:00:00 -0400, 2017-04-23 00:00:00 -0400, 2017-05-07 00:00:00 -0400, 2017-05-21 00:00:00 -0400, 2017-06-04 00:00:00 -0400, 2017-06-18 00:00:00 -0400, 2017-07-02 00:00:00 -0400, 2017-07-16 00:00:00 -0400, 2017-07-30 00:00:00 -0400, 2017-08-13 00:00:00 -0400, 2017-08-27 00:00:00 -0400, 2017-09-10 00:00:00 -0400, 2017-09-24 00:00:00 -0400, 2017-10-08 00:00:00 -0400, 2017-10-22 00:00:00 -0400, 2017-11-05 00:00:00 -0400, 2017-11-19 00:00:00 -0500, 2017-12-03 00:00:00 -0500, 2017-12-17 00:00:00 -0500, 2017-12-31 00:00:00 -0500]
event.schedule.previous_occurrence(Date.today)
=> 2017-07-30 00:00:00 -0400
event.schedule.previous_occurrence(Date.today)
=> 2017-07-30 00:00:00 -0400
event.schedule.next_occurrence(Date.today)
=> 2017-08-27 00:00:00 -0400
event.schedule.next_occurrences(4, Date.today)
=> [2017-08-27 00:00:00 -0400, 2017-09-10 00:00:00 -0400, 2017-09-24 00:00:00 -0400, 2017-10-08 00:00:00 -0400]