Je crée une application de calendrier de groupe qui doit prendre en charge les événements récurrents, mais toutes les solutions que j'ai trouvées pour gérer ces événements semblent être un hack. Je peux limiter jusqu'où l'on peut regarder, puis générer tous les événements à la fois. Ou je peux stocker les événements en les répétant et les afficher dynamiquement quand on regarde en avant sur le calendrier, mais je devrai les convertir en un événement normal si quelqu'un veut changer les détails d'une instance particulière de l'événement.
Je suis sûr qu'il existe une meilleure façon de procéder, mais je ne l'ai pas encore trouvée. Quelle est la meilleure façon de modéliser des événements récurrents, où vous pouvez modifier les détails ou supprimer des instances d'événement particulières?
(J'utilise Ruby, mais s'il vous plaît ne laissez pas cela limiter votre réponse. S'il y a une bibliothèque spécifique à Ruby ou quelque chose, cependant, c'est bon à savoir.)
la source
Martin Fowler - Evénements récurrents pour les calendriers contient des informations et des modèles intéressants.
Runt gem met en œuvre ce modèle.
la source
Il peut y avoir de nombreux problèmes avec les événements récurrents, permettez-moi d'en souligner quelques-uns que je connais.
Solution 1 - pas d'instances
Stockez le rendez-vous d'origine + les données de récurrence, ne stockez pas toutes les instances.
Problèmes:
Solution 2 - Stocker des instances
Stockez tout depuis 1, mais aussi toutes les instances, liées au rendez-vous d'origine.
Problèmes:
Bien sûr, si vous n'allez pas faire d'exceptions, alors l'une ou l'autre solution devrait convenir, et vous choisissez essentiellement un scénario de compromis temps / espace.
la source
J'ai développé plusieurs applications basées sur le calendrier et j'ai également créé un ensemble de composants de calendrier JavaScript réutilisables qui prennent en charge la récurrence. J'ai rédigé un aperçu de la façon de concevoir pour la récurrence qui pourrait être utile à quelqu'un. Bien qu'il existe quelques bits spécifiques à la bibliothèque que j'ai écrite, la grande majorité des conseils offerts sont généraux pour toute implémentation de calendrier.
Quelques points clés:
C'est un sujet vraiment compliqué avec de nombreuses approches valables pour le mettre en œuvre. Je dirai que j'ai effectivement mis en œuvre la récurrence plusieurs fois avec succès, et je me garderais de prendre conseil à ce sujet de quiconque ne l'a pas fait.
la source
Vous voudrez peut-être regarder les implémentations du logiciel iCalendar ou la norme elle-même (
RFC 2445RFC 5545 ). Ceux qui viennent à l'esprit rapidement sont les projets Mozilla http://www.mozilla.org/projects/calendar/ Une recherche rapide révèle également http://icalendar.rubyforge.org/ .D'autres options peuvent être envisagées en fonction de la façon dont vous allez stocker les événements. Construisez-vous votre propre schéma de base de données? Vous utilisez quelque chose basé sur iCalendar, etc.?
la source
Je travaille avec les éléments suivants:
et un joyau en cours qui étend formtastic avec un type d'entrée: recurring (
form.schedule :as => :recurring
), qui rend une interface de type iCal et abefore_filter
pour sérialiser à nouveau la vue en unIceCube
objet, ghetto-ly.Mon idée est de faciliter l'incrédibilité pour ajouter des attributs récurrents à un modèle et le connecter facilement dans la vue. Le tout en quelques lignes.
Alors qu'est-ce que cela me donne? Attributs indexés, modifiables et récurrents.
events
stocke une seule instance de jour, et est utilisé dans l'affichage du calendrier / aide disenttask.schedule
stocke le yaml'dIceCube
objet, de sorte que vous pouvez faire des appels comme:task.schedule.next_suggestion
.Récapitulation: j'utilise deux modèles, un plat, pour l'affichage du calendrier, et un attribut pour la fonctionnalité.
la source
J'utilise le schéma de base de données tel que décrit ci-dessous pour stocker les paramètres de récurrence
http://github.com/bakineggs/recurring_events_for
Ensuite, j'utilise runt pour calculer dynamiquement les dates.
https://github.com/mlipper/runt
la source
Notez que si vous autorisez des règles de récurrence qui ne se terminent pas, vous devez réfléchir à la façon d'afficher votre quantité désormais infinie d'informations.
J'espère que cela pourra aider!
la source
Je recommanderais d'utiliser la puissance de la bibliothèque de dates et la sémantique du module de plage de ruby. Un événement récurrent est en réalité une heure, une plage de dates (un début et une fin) et généralement un seul jour de la semaine. En utilisant la date et la plage, vous pouvez répondre à n'importe quelle question:
Produit tous les jours de l'événement, y compris l'année bissextile!
la source
À partir de ces réponses, j'ai en quelque sorte trouvé une solution. J'aime vraiment l'idée du concept de lien. Les événements récurrents peuvent être une liste chaînée, la queue connaissant sa règle de récurrence. La modification d'un événement serait alors facile, car les liens restent en place, et la suppression d'un événement est également facile - il suffit de dissocier un événement, de le supprimer et de le lier à nouveau avant et après. Vous devez toujours interroger les événements récurrents chaque fois que quelqu'un regarde une nouvelle période jamais vue auparavant dans le calendrier, mais sinon c'est assez propre.
la source
Vous pouvez stocker les événements comme répétitifs et, si une instance particulière a été modifiée, créer un nouvel événement avec le même ID d'événement. Ensuite, lorsque vous recherchez l'événement, recherchez tous les événements avec le même ID d'événement pour obtenir toutes les informations. Je ne sais pas si vous avez lancé votre propre bibliothèque d'événements, ou si vous en utilisez une existante, donc ce n'est peut-être pas possible.
la source
Consultez l'article ci-dessous pour trois bonnes bibliothèques de date / heure rubis. ice_cube en particulier semble un choix solide pour les règles de récurrence et d'autres éléments dont un calendrier d'événements aurait besoin. http://www.rubyinside.com/3-new-date-and-time-libraries-for-rubyists-3238.html
la source
En javascript:
Gestion des plannings récurrents: http://bunkat.github.io/later/
Gestion des événements complexes et des dépendances entre ces planifications: http://bunkat.github.io/schedule/
Fondamentalement, vous créez les règles puis vous demandez à la bibliothèque de calculer les N événements récurrents suivants (en spécifiant une plage de dates ou non). Les règles peuvent être analysées / sérialisées pour les enregistrer dans votre modèle.
Si vous avez un événement récurrent et souhaitez modifier une seule récurrence, vous pouvez utiliser la fonction except () pour ignorer un jour particulier, puis ajouter un nouvel événement modifié pour cette entrée.
La bibliothèque prend en charge des motifs très complexes, des fuseaux horaires et même des événements de croning.
la source
Stockez les événements en les répétant et affichez-les dynamiquement, mais autorisez l'événement récurrent à contenir une liste d'événements spécifiques qui pourraient remplacer les informations par défaut un jour spécifique.
Lorsque vous interrogez l'événement récurrent, il peut rechercher un remplacement spécifique pour ce jour.
Si un utilisateur apporte des modifications, vous pouvez lui demander s'il souhaite mettre à jour pour toutes les instances (détails par défaut) ou juste ce jour-là (créer un nouvel événement spécifique et l'ajouter à la liste).
Si un utilisateur demande de supprimer toutes les récurrences de cet événement, vous avez également la liste des détails à portée de main et vous pouvez les supprimer facilement.
Le seul cas problématique serait si l'utilisateur souhaite mettre à jour cet événement et tous les événements futurs. Dans ce cas, vous devrez diviser l'événement récurrent en deux. À ce stade, vous souhaiterez peut-être envisager de lier des événements récurrents d'une manière quelconque afin de pouvoir les supprimer tous.
la source
Pour les programmeurs .NET qui sont prêts à payer des frais de licence, vous pourriez trouver Aspose.Network utile ... il comprend une bibliothèque compatible iCalendar pour les rendez-vous récurrents.
la source
Vous stockez directement les événements au format iCalendar, ce qui permet une répétition ouverte, une localisation de fuseau horaire, etc.
Vous pouvez les stocker dans un serveur CalDAV, puis lorsque vous souhaitez afficher les événements, vous pouvez utiliser l'option du rapport défini dans CalDAV pour demander au serveur de faire l'expansion des événements récurrents sur la période affichée.
Ou vous pouvez les stocker vous-même dans une base de données et utiliser une sorte de bibliothèque d'analyse iCalendar pour faire l'expansion, sans avoir besoin de PUT / GET / REPORT pour parler à un serveur CalDAV backend. C'est probablement plus de travail - je suis sûr que les serveurs CalDAV cachent la complexité quelque part.
Le fait d'avoir les événements au format iCalendar simplifiera probablement les choses à long terme, car les gens voudront toujours qu'ils soient exportés pour être intégrés à d'autres logiciels de toute façon.
la source
J'ai simplement implémenté cette fonctionnalité! La logique est la suivante, vous avez d'abord besoin de deux tables. RuleTable stocke les événements paternels généraux ou recyclés. ItemTable est des événements de cycle stockés. Par exemple, lorsque vous créez un événement cyclique, l'heure de début pour le 6 novembre 2015, l'heure de fin pour le 6 décembre (ou pour toujours), cycle d'une semaine. Vous insérez des données dans une table de règles, les champs sont les suivants:
Vous souhaitez maintenant interroger les données du 20 novembre au 20 décembre. Vous pouvez écrire une fonction RecurringEventBE (début long, fin longue), en fonction des heures de début et de fin, WeekLy, vous pouvez calculer la collection que vous voulez, <cycleA11.20, cycleA 11.27, cycleA 12.4 ......>. En plus du 6 novembre et du reste, je l'ai appelé un événement virtuel. Lorsque l'utilisateur modifie le nom d'un événement virtuel après (cycleA11.27 par exemple), vous insérez des données dans un ItemTable. Les champs sont les suivants:
Dans la fonction RecurringEventBE (long start, long end), vous utilisez ces données couvrant l'événement virtuel (cycleB11.27) désolé pour mon anglais, j'ai essayé.
Ceci est mon événement récurrentBE:
la source
Puis-je suggérer que "aucune date de fin" ne peut être résolue à une date de fin à la fin du siècle. Même pour un événement quotidien, la quantité d'espace reste bon marché.
la source