Ich erstelle eine Gruppenkalenderanwendung, die wiederkehrende Ereignisse unterstützen muss, aber alle Lösungen, die ich zur Behandlung dieser Ereignisse entwickelt habe, scheinen ein Hack zu sein. Ich kann einschränken, wie weit man vorausschauen kann, und dann alle Ereignisse gleichzeitig generieren. Oder ich kann die Ereignisse als sich wiederholend speichern und dynamisch anzeigen, wenn man im Kalender nach vorne schaut, aber ich muss sie in ein normales Ereignis konvertieren, wenn jemand die Details zu einer bestimmten Instanz des Ereignisses ändern möchte.
Ich bin mir sicher, dass es einen besseren Weg gibt, aber ich habe ihn noch nicht gefunden. Was ist der beste Weg, um wiederkehrende Ereignisse zu modellieren, bei denen Sie Details bestimmter Ereignisinstanzen ändern oder löschen können?
(Ich verwende Ruby, aber bitte lassen Sie sich dadurch Ihre Antwort nicht einschränken. Wenn es jedoch eine Ruby-spezifische Bibliothek oder ähnliches gibt, ist das gut zu wissen.)
quelle
Martin Fowler - Wiederkehrende Ereignisse für Kalender enthält einige interessante Einblicke und Muster.
Runt Gem implementiert dieses Muster.
quelle
Bei wiederkehrenden Ereignissen kann es viele Probleme geben. Lassen Sie mich einige hervorheben, von denen ich weiß.
Lösung 1 - keine Instanzen
Speichern Sie die ursprünglichen Termin- und Wiederholungsdaten. Speichern Sie nicht alle Instanzen.
Probleme:
Lösung 2 - Instanzen speichern
Speichern Sie alles von 1, aber auch alle Instanzen, die mit dem ursprünglichen Termin verknüpft sind.
Probleme:
Wenn Sie keine Ausnahmen machen, sollte natürlich jede der beiden Lösungen in Ordnung sein, und Sie wählen grundsätzlich aus einem Zeit / Raum-Kompromiss-Szenario.
quelle
Ich habe mehrere kalenderbasierte Anwendungen entwickelt und eine Reihe wiederverwendbarer JavaScript-Kalenderkomponenten erstellt, die die Wiederholung unterstützen. Ich habe einen Überblick darüber geschrieben, wie man für eine Wiederholung entwirft jemanden hilfreich sein könnte. Während es einige Bits gibt, die spezifisch für die Bibliothek sind, die ich geschrieben habe, ist die überwiegende Mehrheit der angebotenen Ratschläge für jede Kalenderimplementierung allgemein.
Einige der wichtigsten Punkte:
Es ist ein wirklich kompliziertes Thema mit vielen, vielen gültigen Ansätzen zur Implementierung. Ich werde sagen, dass ich die Wiederholung tatsächlich mehrmals erfolgreich implementiert habe, und ich würde mich davor hüten, Ratschläge zu diesem Thema von jedem zu erhalten, der dies nicht wirklich getan hat.
quelle
Möglicherweise möchten Sie sich die Implementierungen der iCalendar-Software oder den Standard selbst (
RFC 2445RFC 5545 ) ansehen . Schnell in den Sinn kommen die Mozilla-Projekte http://www.mozilla.org/projects/calendar/ Eine schnelle Suche zeigt http://icalendar.rubyforge.org/ .Abhängig davon, wie Sie die Ereignisse speichern, können andere Optionen in Betracht gezogen werden. Erstellen Sie Ihr eigenes Datenbankschema? Verwenden Sie etwas iCalendar-basiertes usw.?
quelle
Ich arbeite mit Folgendem:
und ein Juwel in Bearbeitung, das formtastic um einen Eingabetyp erweitert: Wiederkehrend (
form.schedule :as => :recurring
), der eine iCal-ähnliche Schnittstelle rendert undbefore_filter
die AnsichtIceCube
ghetto- artig wieder in ein Objekt serialisiert .Meine Idee ist es, es unglaublich einfach zu machen, einem Modell wiederkehrende Attribute hinzuzufügen und es einfach in der Ansicht zu verbinden. Alles in ein paar Zeilen.
Was gibt mir das? Indizierte, bearbeitbare, wiederkehrende Attribute.
events
speichert eine einzige Tag Instanz und in der Kalenderansicht verwendet wird / sagen Helfertask.schedule
das yaml'd speichertIceCube
Objekt, so dass Sie Anrufe wie tun können:task.schedule.next_suggestion
.Fazit: Ich verwende zwei Modelle, ein flaches für die Kalenderanzeige und ein Attribut für die Funktionalität.
quelle
Ich verwende das unten beschriebene Datenbankschema, um die Wiederholungsparameter zu speichern
http://github.com/bakineggs/recurring_events_for
Dann benutze ich Runt, um die Daten dynamisch zu berechnen.
https://github.com/mlipper/runt
quelle
Beachten Sie, dass Sie überlegen müssen, wie Sie Ihre jetzt unendlich viele Informationen anzeigen können, wenn Sie Wiederholungsregeln zulassen, die nicht enden.
Hoffentlich hilft das!
quelle
Ich würde empfehlen, die Leistung der Datumsbibliothek und die Semantik des Bereichsmoduls von Ruby zu verwenden. Ein wiederkehrendes Ereignis ist wirklich eine Zeit, ein Zeitraum (ein Start und ein Ende) und normalerweise ein einzelner Wochentag. Mit Datum & Bereich können Sie jede Frage beantworten:
Produziert alle Tage der Veranstaltung, einschließlich des Schaltjahres!
quelle
Aus diesen Antworten habe ich eine Art Lösung herausgesucht. Die Idee des Link-Konzepts gefällt mir sehr gut. Wiederkehrende Ereignisse können eine verknüpfte Liste sein, wobei der Schwanz seine Wiederholungsregel kennt. Das Ändern eines Ereignisses wäre dann einfach, da die Verknüpfungen bestehen bleiben und das Löschen eines Ereignisses ebenfalls einfach ist. Sie müssen lediglich die Verknüpfung eines Ereignisses aufheben, es löschen und das Ereignis davor und danach erneut verknüpfen. Sie müssen immer noch wiederkehrende Ereignisse abfragen, wenn jemand einen neuen Zeitraum betrachtet, der noch nie zuvor im Kalender angezeigt wurde. Andernfalls ist dies ziemlich sauber.
quelle
Sie können die Ereignisse als sich wiederholend speichern. Wenn eine bestimmte Instanz bearbeitet wurde, erstellen Sie ein neues Ereignis mit derselben Ereignis-ID. Suchen Sie dann beim Nachschlagen des Ereignisses nach allen Ereignissen mit derselben Ereignis-ID, um alle Informationen zu erhalten. Ich bin mir nicht sicher, ob Sie Ihre eigene Ereignisbibliothek gerollt haben oder ob Sie eine vorhandene verwenden, sodass dies möglicherweise nicht möglich ist.
quelle
Im folgenden Artikel finden Sie drei gute Ruby-Datums- / Zeitbibliotheken. Insbesondere ice_cube scheint eine gute Wahl für Wiederholungsregeln und andere Dinge zu sein, die ein Veranstaltungskalender benötigen würde. http://www.rubyinside.com/3-new-date-and-time-libraries-for-rubyists-3238.html
quelle
In Javascript:
Umgang mit wiederkehrenden Zeitplänen: http://bunkat.github.io/later/
Behandlung komplexer Ereignisse und Abhängigkeiten zwischen diesen Zeitplänen: http://bunkat.github.io/schedule/
Grundsätzlich erstellen Sie die Regeln und fordern die Bibliothek auf, die nächsten N wiederkehrenden Ereignisse zu berechnen (Angabe eines Datumsbereichs oder nicht). Die Regeln können analysiert / serialisiert werden, um sie in Ihrem Modell zu speichern.
Wenn Sie ein wiederkehrendes Ereignis haben und nur eine Wiederholung ändern möchten, können Sie die Ausnahme () verwenden. Funktion exception einen bestimmten Tag schließen und dann ein neues geändertes Ereignis für diesen Eintrag hinzufügen.
Die Bibliothek unterstützt sehr komplexe Muster, Zeitzonen und sogar Croning-Ereignisse.
quelle
Speichern Sie die Ereignisse als sich wiederholend und zeigen Sie sie dynamisch an. Ermöglichen Sie jedoch, dass das wiederkehrende Ereignis eine Liste bestimmter Ereignisse enthält, die die Standardinformationen an einem bestimmten Tag überschreiben können.
Wenn Sie das wiederkehrende Ereignis abfragen, kann es nach einer bestimmten Überschreibung für diesen Tag suchen.
Wenn ein Benutzer Änderungen vornimmt, können Sie fragen, ob er für alle Instanzen (Standarddetails) oder nur für diesen Tag (ein neues spezifisches Ereignis erstellen und zur Liste hinzufügen) aktualisieren möchte.
Wenn ein Benutzer alle Wiederholungen dieses Ereignisses löschen möchte, haben Sie auch die Liste der Details zur Hand und können diese leicht entfernen.
Der einzige problematische Fall wäre, wenn der Benutzer dieses Ereignis und alle zukünftigen Ereignisse aktualisieren möchte. In diesem Fall müssen Sie das wiederkehrende Ereignis in zwei Teile teilen. An dieser Stelle möchten Sie möglicherweise wiederkehrende Ereignisse in irgendeiner Weise verknüpfen, damit Sie sie alle löschen können.
quelle
Für .NET-Programmierer, die bereit sind, Lizenzgebühren zu zahlen, ist Aspose.Network möglicherweise hilfreich. Es enthält eine iCalendar-kompatible Bibliothek für wiederkehrende Termine.
quelle
Sie speichern die Ereignisse direkt im iCalendar-Format, was eine unbegrenzte Wiederholung, Zeitzonenlokalisierung usw. ermöglicht.
Sie können diese auf einem CalDAV-Server speichern. Wenn Sie dann die Ereignisse anzeigen möchten, können Sie mithilfe der Option des in CalDAV definierten Berichts den Server auffordern, die Erweiterung der wiederkehrenden Ereignisse über den angezeigten Zeitraum durchzuführen.
Sie können sie auch selbst in einer Datenbank speichern und eine Art iCalendar-Analysebibliothek verwenden, um die Erweiterung durchzuführen, ohne dass PUT / GET / REPORT für die Kommunikation mit einem CalDAV-Backend-Server erforderlich ist. Dies ist wahrscheinlich mehr Arbeit - ich bin sicher, dass CalDAV-Server die Komplexität irgendwo verbergen.
Wenn die Ereignisse im iCalendar-Format vorliegen, wird dies auf lange Sicht wahrscheinlich einfacher, da die Benutzer immer möchten, dass sie exportiert werden, um ohnehin andere Software einzufügen.
quelle
Ich habe diese Funktion einfach implementiert! Die Logik ist wie folgt: Zuerst benötigen Sie zwei Tabellen. RuleTable speichert allgemeine oder recycelt väterliche Ereignisse. ItemTable speichert Zyklusereignisse. Wenn Sie beispielsweise ein zyklisches Ereignis erstellen, wird die Startzeit für den 6. November 2015, die Endzeit für den 6. Dezember (oder für immer) für eine Woche festgelegt. Sie fügen Daten in eine Regeltabelle ein. Die Felder lauten wie folgt:
Jetzt möchten Sie Daten vom 20. November bis 20. Dezember abfragen. Sie können eine Funktion RecurringEventBE (langer Start, langes Ende) schreiben, basierend auf der Start- und Endzeit WeekLy. Sie können die gewünschte Sammlung berechnen: <ZyklusA11.20, ZyklusA 11.27, ZyklusA 12.4 ......>. Zusätzlich zum 6. November und dem Rest nannte ich ihn ein virtuelles Ereignis. Wenn der Benutzer den Namen eines virtuellen Ereignisses nach (z. B. Zyklus A11.27) ändert, fügen Sie Daten in eine ItemTable ein. Die Felder lauten wie folgt:
In der Funktion RecurringEventBE (langer Start, langes Ende) verwenden Sie diese Daten für ein virtuelles Ereignis (Zyklus B11.27). Entschuldigung für mein Englisch, ich habe es versucht.
Dies ist mein RecurringEventBE:
quelle
Darf ich vorschlagen, dass "kein Enddatum" auf ein Enddatum am Ende des Jahrhunderts aufgelöst werden kann. Selbst für eine tägliche Veranstaltung bleibt der Platz günstig.
quelle