下面是我将如何建模。我还没有使用Google日历,所以我将基于iCal的经常性事件的功能。
所有模型应该具有通常的id,created_at,updated_at属性。列出的是自定义属性。如果该财产是另一个模型,您将执行它的关联,如has_one
或belongs_to
。
RecurrencePeriod
Event
base_event #has_one :base_event, :class_name'Event'
Time
END_DATE #可以是零,当它反复永远
WeeklyRecurrence
复发#has_one :recurrence, :as=>:recurrence
Array[OccurrenceOverride]
所覆盖#has_many :overrides, :class_name=>'OccurrenceOverride'
的RecurrencePeriod
开始在其base_event开始的日期。另外,我假定Event
的employee_id是指创建该事件的员工。 A RecurrencePeriod
也将属于创建base_event的员工。
该模型取决于您希望如何灵活指定重复。您是否打算支持“周二和周四每两周从早上10点到上午11点,从下午2点到下午3点”或者“每周重复”?这是一个支持“每周重复”,“每两周重复一次”的模型。如果需要,您可以扩展它。
WeeklyRecurrence
Integer
weeks_between_recurrences
RecurrencePeriod
RECURRENCE_PERIOD #belongs_to :recurrence, :polymorphic=>true
我用polymorphic associations这里,因为我觉得他们可能是有用的,如果你想要更多的不是一个类型的复发,例如WeeklyRecurrence
和DailyRecurrence
。但我不确定他们是否是正确的模拟方式,所以如果他们不成立,只需使用has_one :weekly_recurrence
和belongs_to :recurrence_period
。
Ice cube库似乎可能对计算重现有用。如果上面的WeeklyRecurrence
功能不够强大,您可能只想在模型中存储冰块Schedule
对象,替换WeeklyRecurrence
。要将Schedule
对象存储在模型中,请将其保存为属性“计划”,将serialize :schedule
放入模型定义中,并在数据库中生成文本列“计划”。
OccurrenceOverride
处理正在编辑的重复事件的单个实例的情况。
OccurrenceOverride
RecurrencePeriod
recurrence_period_to_override #belongs_to :recurrence_period_to_override, :class_name=>'RecurrencePeriod'
Time
original_start_time#唯一地识别哪个那RecurrencePeriod内复发取代
Event
replacement_event has_one :replacement_event, :class_name=>'Event'
#;可能是零,如果复发被删除,而不是编辑
而是单独存储事件的每次出现的,暂时生成它们,当你需要向他们展示在视图中。在RecurrencePeriod
中,创建一个方法generate_events_in_range(start_date, end_date)
,该方法生成Event
,不保存在数据库中,而只是传递给视图以便显示它们。
当用户编辑重现时,他们应该可以选择修改所有出现次数,所有未来出现次数或仅该事件。如果他们修改所有事件,请修改RecurrencePeriod
的base_event。如果他们修改所有将来的事件,请使用您应该在RecurrencePeriod
上实施的方法,该方法将自己分裂为某个日期的两侧的两个RecurrencePeriod
,然后将更改保存到第二个时间段。如果他们仅修改该事件,则在他们覆盖的时间内创建一个OccurrenceOverride
,并将更改保存到覆盖的replacement_event。
当用户表示某个事件现在应该每隔两周在可预见的将来重复出现时,您应该创建一个新的RecurrencePeriod
,该事件的事件为base_event和nil end_date。它的复发应该是一个新的WeeklyRecurrence
,周期为between_recurrence = 2,它应该没有OccurrenceOverride
s。
从没有持续发生,但不能通过id访问它的经验的任何问题? (性能,复杂性等) – ted 2013-09-04 15:59:17
@ted好的问题。我从来没有实现过,所以恐怕我不知道是否根据需要产生事件会导致任何问题。我想你可以根据需要为生成的事件设置一个缓存。缓存系统可能会使用这样一个事实,即生成的保存事件在概念上与“OccurrenceOverride”非常相似,尽管不完全相同。 – 2013-09-04 18:31:35