यहां यह है कि मैं इसे कैसे मॉडल करूंगा। मैंने Google कैलेंडर का अधिक उपयोग नहीं किया है, इसलिए मैं iCal की पुनरावर्ती घटनाओं की कार्यक्षमता का आधार बना रहा हूं।
सभी मॉडलों में सामान्य आईडी, create_at, update_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'
तारीख है कि इसके base_event शुरू होता है पर RecurrencePeriod
शुरू होता है। साथ ही, मुझे लगता है कि Event
का कर्मचारी_आई उस कर्मचारी को संदर्भित करता है जिसने उस ईवेंट को बनाया है। RecurrencePeriod
उस कर्मचारी से भी संबंधित होगा जिसने base_event बनाया है।
मॉडल इस बात पर निर्भर करता है कि आप कितनी लचीली रूप से आवर्ती निर्दिष्ट करने में सक्षम होना चाहते हैं। क्या आप "मंगलवार और गुरुवार को हर दो सप्ताह 10 बजे से 11 बजे तक और दोपहर 2 बजे से शाम 3 बजे तक" या "साप्ताहिक दोहराते हैं" का समर्थन करने जा रहे हैं? यहां एक मॉडल है जो "साप्ताहिक दोहराता है" का समर्थन करता है, "हर दो सप्ताह दोहराता है", आदि; यदि आपको आवश्यकता हो तो आप इसका विस्तार कर सकते हैं।
WeeklyRecurrence
Integer
weeks_between_recurrences
RecurrencePeriod
RECURRENCE_PERIOD # belongs_to :recurrence, :polymorphic=>true
मैं polymorphic associations यहाँ का उपयोग करें, क्योंकि मुझे लगता है कि वे उपयोगी हो सकता है अगर आप एक से अधिक प्रकार चाहते हैं पुनरावृत्ति की तरह,दोनोंऔर DailyRecurrence
। लेकिन मुझे यकीन नहीं है कि वे मॉडल करने का सही तरीका हैं, इसलिए यदि वे बाहर नहीं निकलते हैं, तो बस इसके बजाय has_one :weekly_recurrence
और belongs_to :recurrence_period
का उपयोग करें।
Ice cube लाइब्रेरी ऐसा लगता है कि यह पुनरावर्तन की गणना के लिए उपयोगी हो सकता है। यदि ऊपर WeeklyRecurrence
पर्याप्त शक्तिशाली नहीं है, तो आप WeeklyRecurrence
को प्रतिस्थापित करते हुए मॉडल में एक आइस क्यूब Schedule
ऑब्जेक्ट स्टोर करना चाहते हैं। मॉडल में 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
बनाएं जब वे ओवरराइड कर रहे हों, और ओवरराइड के प्रतिस्थापन_वेंव में परिवर्तनों को सहेजें।
जब कोई उपयोगकर्ता कहता है कि एक निश्चित घटना को अब निकट भविष्य के लिए हर दो सप्ताह में दोहराया जाना चाहिए, तो आपको उस ईवेंट के साथ बेस_एवेंट और एक शून्य end_date के रूप में एक नया RecurrencePeriod
बनाना चाहिए। इसका पुनरावृत्ति सप्ताह 0bसप्ताह_between_recurrence = 2 के साथ होना चाहिए, और इसमें OccurrenceOverride
एस नहीं होना चाहिए।
किसी भी समस्या को बरकरार रखने के अनुभव से कोई समस्या नहीं है, हालांकि आईडी द्वारा इसे एक्सेस करने में सक्षम नहीं है? (प्रदर्शन, जटिलता, आदि) – ted
@ अच्छा सवाल है। मैंने कभी इसे लागू नहीं किया है, इसलिए मुझे डर है कि मुझे नहीं पता कि क्या उत्पन्न होने वाली घटनाएं किसी भी समस्या का कारण बनती हैं। मुझे लगता है कि अगर आवश्यक हो तो आप उत्पन्न घटनाओं के लिए एक कैश स्थापित कर सकते हैं। एक कैशिंग सिस्टम इस तथ्य का उपयोग कर सकता है कि सहेजने के लिए उत्पन्न उत्पन्न घटना अवधारणात्मक रूप से 'OccurrenceOverride' के समान ही है, हालांकि समान नहीं है। –