これが私がこれをモデル化する方法です。私は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 #が永久に繰り返される場合、nilになる可能性があります
WeeklyRecurrence
再発#has_one :recurrence, :as=>:recurrence
Array[OccurrenceOverride]
オーバーライド#has_many :overrides, :class_name=>'OccurrenceOverride'
base_eventRecurrencePeriod
が開始する日付から開始します。また、Event
's employee_idは、そのイベントを作成した従業員を指していると思います。ARecurrencePeriod
は、base_eventを作成した従業員にも属します。
モデルは、繰り返しを指定できるようにする柔軟性によって異なります。「火曜日と木曜日は2週間ごとに午前10時から午前11時までと午後2時から午後3時まで」をサポートしますか、それとも単に「毎週繰り返す」をサポートしますか?これは、「毎週繰り返す」、「2週間ごとに繰り返す」などをサポートするモデルです。必要に応じて拡張できます。
WeeklyRecurrence
Integer
weeks_between_recurrences
RecurrencePeriod
recurrence_period #belongs_to :recurrence, :polymorphic=>true
ここではポリモーフィックな関連付けを使用します。これは、との両方WeeklyRecurrence
など、複数のタイプの再発が必要な場合に役立つと思うためですDailyRecurrence
。しかし、それらがそれをモデル化する正しい方法であるかどうかはわかりません。したがって、そうでないことが判明した場合は、代わりにを使用has_one :weekly_recurrence
しbelongs_to :recurrence_period
てください。
アイスキューブライブラリは、再発の計算に役立つ可能性があるようです。WeeklyRecurrence
上記が十分に強力でない場合は、を置き換えて、モデルにアイスキューブオブジェクトを格納することをお勧めしSchedule
ますWeeklyRecurrence
。オブジェクトをモデルに保存するには、Schedule
オブジェクトを属性「schedule」として保存しserialize :schedule
、モデル定義に入れて、データベースにテキスト列「schedule」を生成します。
OccurrenceOverride
編集中の定期的なイベントの単一インスタンスの場合を処理します。
OccurrenceOverride
RecurrencePeriod
recurrence_period_to_override #belongs_to :recurrence_period_to_override, :class_name=>'RecurrencePeriod'
Time
original_start_time #そのRecurrencePeriod内のどの再発を置き換えるかを一意に識別します
Event
replace_event #has_one :replacement_event, :class_name=>'Event'
; その再発が編集される代わりに削除された場合、nilになる可能性があります
イベントの各発生を個別に保存するのではなく、ビューに表示する必要があるときに一時的に生成します。で、sを生成RecurrencePeriod
するメソッドを作成します。データベースに保存するのではなく、ビューに渡して表示できるようにします。generate_events_in_range(start_date, end_date)
Event
ユーザーが繰り返しを編集するときは、すべての発生、将来のすべての発生、またはそのイベントのみを変更するオプションが必要です。すべてのオカレンスを変更する場合は、RecurrencePeriod
'sbase_eventを変更します。それらが将来のすべての発生を変更する場合は、特定の日付の両側でRecurrencePeriod
2つに分割される、実装する必要のあるメソッドを使用して、変更を2番目の期間だけに保存します。RecurrencePeriod
それらがそのイベントのみを変更する場合はOccurrenceOverride
、それらがオーバーライドしている時間の間を作成し、オーバーライドのreplacement_eventに変更を保存します。
ユーザーが、特定のイベントが当面の間2週間ごとに繰り返される必要があると言った場合、RecurrencePeriod
そのイベントをbase_eventおよびnilend_dateとして新しいものを作成する必要があります。その再発はWeeklyRecurrence
、weeks_between_recurrence = 2の新しいものである必要があり、sがない必要がありOccurrenceOverride
ます。