这是我对此进行建模的方法。我不太用过 Google 日历,所以我的功能基于iCal http://support.apple.com/kb/HT2513的重复发生的事件。
所有模型都应具有常用的 id、created_at、updated_at 属性。列出的是自定义属性。如果该属性是另一个模型,您将实现它的关联,例如has_one
or belongs_to
.
-
RecurrencePeriod
-
Event
基本事件# has_one :base_event, :class_name'Event'
-
Time
结束日期# 如果永远重复的话可能为零
-
WeeklyRecurrence
复发# has_one :recurrence, :as=>:recurrence
-
Array[OccurrenceOverride]
覆盖# has_many :overrides, :class_name=>'OccurrenceOverride'
The RecurrencePeriod
从其 base_event 开始的日期开始。另外,我假设Event
的employee_id 指的是创建该事件的员工。 ARecurrencePeriod
也将属于创建该 base_event 的员工。
该模型取决于您希望指定重复的灵活性。您打算支持“每两周周二和周四上午 10 点到上午 11 点以及下午 2 点到下午 3 点”还是只是“每周重复”?这是一个仅支持“每周重复”、“每两周重复”等的模型;如果需要,您可以扩展它。
-
WeeklyRecurrence
-
Integer
重复次数之间的周数
-
RecurrencePeriod
复发期# belongs_to :recurrence, :polymorphic=>true
I use 多态关联 http://guides.rubyonrails.org/association_basics.html#polymorphic-associations在这里,因为我认为如果您想要不止一种类型的重复,它们可能会很有用,例如WeeklyRecurrence
and DailyRecurrence
。但我不确定它们是建模的正确方法,所以如果结果不是,只需使用has_one :weekly_recurrence
and belongs_to :recurrence_period
反而。
The Ice cube http://seejohnrun.github.com/ice_cube/库似乎对于计算重复率可能有用。如果WeeklyRecurrence
上面的功能不够强大,您可能只想存储一个冰块Schedule
模型中的对象,替换WeeklyRecurrence
。存储一个Schedule
模型中的对象,将其保存为属性“schedule”,放入serialize :schedule
在模型定义中,并在数据库中生成文本列“schedule”。
OccurrenceOverride
处理正在编辑的重复事件的单个实例的情况。
-
OccurrenceOverride
-
RecurrencePeriod
覆盖周期# belongs_to :recurrence_period_to_override, :class_name=>'RecurrencePeriod'
-
Time
原始开始时间# 唯一标识要替换的 RecurrencePeriod 内的哪个重复
-
Event
替换事件# has_one :replacement_event, :class_name=>'Event'
;如果该重复被删除而不是编辑,则可能为零
当您需要在视图中显示事件时,可以临时生成事件,而不是单独存储事件的每次发生。在RecurrencePeriod
,创建一个方法generate_events_in_range(start_date, end_date)
产生Event
s,不保存在数据库中,而只是传递给视图以便它可以显示它们。
当用户编辑重复事件时,他们应该可以选择修改所有发生的事件、所有未来发生的事件或仅修改该事件。如果他们修改了所有出现的情况,则修改RecurrencePeriod
的基本事件。如果它们修改了所有未来的事件,请使用您应该实现的方法RecurrencePeriod
它把自己一分为二RecurrencePeriod
s 位于某个日期的两侧,然后将更改保存到第二个期间。如果他们只修改该事件,则创建一个OccurrenceOverride
当它们被覆盖时,并将更改保存到覆盖的 replacement_event 中。
当用户说某个事件现在应该在可预见的未来每两周重复一次时,您应该创建一个新的RecurrencePeriod
该事件作为 base_event 和 nil end_date。它的复发应该是一个新的WeeklyRecurrence
Weeks_ Between_recurrence = 2,并且它应该没有OccurrenceOverride
s.