Estoy creando una aplicación de calendario grupal que necesita soportar eventos recurrentes, pero todas las soluciones que he encontrado para manejar estos eventos parecen un truco. Puedo limitar qué tan lejos se puede mirar, y luego generar todos los eventos a la vez. O puedo almacenar los eventos como repetitivos y mostrarlos dinámicamente cuando uno mira hacia adelante en el calendario, pero tendré que convertirlos en un evento normal si alguien quiere cambiar los detalles en una instancia particular del evento.
Estoy seguro de que hay una mejor manera de hacerlo, pero aún no la he encontrado. ¿Cuál es la mejor manera de modelar eventos recurrentes, donde puede cambiar detalles o eliminar instancias de eventos particulares?
(Estoy usando Ruby, pero no permita que eso limite su respuesta. Sin embargo, si hay una biblioteca específica de Ruby o algo así, es bueno saberlo).
fuente
Martin Fowler - Eventos recurrentes para calendarios contiene algunas ideas y patrones interesantes.
Runt gem implementa este patrón.
fuente
Puede haber muchos problemas con eventos recurrentes, permítanme destacar algunos que conozco.
Solución 1 - sin instancias
Almacene la cita original + datos de recurrencia, no almacene todas las instancias.
Problemas:
Solución 2 - almacenar instancias
Almacene todo desde 1, pero también todas las instancias, vinculadas a la cita original.
Problemas:
Por supuesto, si no vas a hacer excepciones, entonces cualquiera de las soluciones debería estar bien, y básicamente eliges entre un escenario de compensación tiempo / espacio.
fuente
He desarrollado múltiples aplicaciones basadas en el calendario y también he creado un conjunto de componentes de calendario JavaScript reutilizables que admiten la recurrencia. Escribí una descripción general de cómo diseñar para la recurrencia que podría ser útil para alguien. Si bien hay algunos bits que son específicos de la biblioteca que escribí, la gran mayoría de los consejos ofrecidos son generales para cualquier implementación de calendario.
Algunos de los puntos clave:
Es un tema realmente complicado con muchos, muchos enfoques válidos para implementarlo. Diré que en realidad he implementado la recurrencia varias veces con éxito, y desconfiaría de recibir consejos sobre este tema de cualquiera que no lo haya hecho.
fuente
Es posible que desee ver las implementaciones de software iCalendar o el estándar en sí mismo (
RFC 2445RFC 5545 ). Los que vienen a la mente rápidamente son los proyectos de Mozilla http://www.mozilla.org/projects/calendar/ Una búsqueda rápida revela también http://icalendar.rubyforge.org/ .Se pueden considerar otras opciones dependiendo de cómo va a almacenar los eventos. ¿Está creando su propio esquema de base de datos? ¿Usando algo basado en iCalendar, etc.?
fuente
Estoy trabajando con lo siguiente:
y una gema en progreso que extiende formtastic con un tipo de entrada: recurring (
form.schedule :as => :recurring
), que representa una interfaz similar a iCal y unabefore_filter
para serializar la vista en unIceCube
objeto nuevamente, ghetto-ly.Mi idea es hacer que sea increíblemente fácil agregar atributos recurrentes a un modelo y conectarlo fácilmente en la vista. Todo en un par de líneas.
Entonces, ¿qué me da esto? Atributos indexados, editables, recurrentes.
events
tiendas de una sola instancia día, y se utiliza en la vista de calendario / ayudante dicen quetask.schedule
almacena la yaml'dIceCube
objeto, para que pueda hacer llamadas como:task.schedule.next_suggestion
.Resumen: utilizo dos modelos, uno plano, para la visualización del calendario y otro atribuido para la funcionalidad.
fuente
Estoy usando el esquema de la base de datos como se describe a continuación para almacenar los parámetros de recurrencia
http://github.com/bakineggs/recurring_events_for
Luego uso runt para calcular dinámicamente las fechas.
https://github.com/mlipper/runt
fuente
Tenga en cuenta que si permite reglas de recurrencia que no terminan, debe pensar en cómo mostrar su cantidad ahora infinita de información.
¡Espero que ayude!
fuente
Recomiendo usar el poder de la biblioteca de fechas y la semántica del módulo de rango de ruby. Un evento recurrente es realmente un tiempo, un intervalo de fechas (inicio y final) y, por lo general, un solo día de la semana. Usando fecha y rango puede responder cualquier pregunta:
¡Produce todos los días del evento, incluido el año bisiesto!
fuente
A partir de estas respuestas, he encontrado una solución. Me gusta mucho la idea del concepto de enlace. Los eventos recurrentes podrían ser una lista vinculada, con la cola que conoce su regla de recurrencia. Cambiar un evento sería fácil, porque los enlaces permanecen en su lugar, y eliminar un evento también es fácil: simplemente desvincula un evento, lo elimina y vuelve a vincular el evento antes y después. Todavía tiene que consultar eventos recurrentes cada vez que alguien mira un nuevo período de tiempo nunca antes visto en el calendario, pero de lo contrario, esto es bastante limpio.
fuente
Puede almacenar los eventos como repetitivos, y si se editó una instancia particular, cree un nuevo evento con el mismo ID de evento. Luego, cuando busque el evento, busque todos los eventos con el mismo ID de evento para obtener toda la información. No estoy seguro de si rodó su propia biblioteca de eventos, o si está utilizando una existente, por lo que puede que no sea posible.
fuente
Consulte el siguiente artículo para ver tres buenas bibliotecas de fecha / hora de ruby. ice_cube en particular parece una opción sólida para las reglas de recurrencia y otras cosas que necesitaría un calendario de eventos. http://www.rubyinside.com/3-new-date-and-time-libraries-for-rubyists-3238.html
fuente
En javascript:
Manejo de horarios recurrentes: http://bunkat.github.io/later/
Manejo de eventos complejos y dependencias entre esos horarios: http://bunkat.github.io/schedule/
Básicamente, crea las reglas y luego le pide a la biblioteca que calcule los próximos N eventos recurrentes (especificando un rango de fechas o no). Las reglas se pueden analizar / serializar para guardarlas en su modelo.
Si tiene un evento recurrente y desea modificar solo una recurrencia, puede usar la función except () para descartar un día en particular y luego agregar un nuevo evento modificado para esta entrada.
La biblioteca admite patrones muy complejos, zonas horarias e incluso eventos cronológicos.
fuente
Almacene los eventos como repetitivos y muéstrelos dinámicamente, sin embargo, permita que el evento recurrente contenga una lista de eventos específicos que podrían anular la información predeterminada en un día específico.
Cuando consulta el evento recurrente, puede verificar una anulación específica para ese día.
Si un usuario realiza cambios, puede preguntar si desea actualizar para todas las instancias (detalles predeterminados) o solo ese día (realice un nuevo evento específico y agréguelo a la lista).
Si un usuario solicita eliminar todas las repeticiones de este evento, también tiene la lista de detalles a mano y puede eliminarlos fácilmente.
El único caso problemático sería si el usuario desea actualizar este evento y todos los eventos futuros. En cuyo caso, tendrá que dividir el evento recurrente en dos. En este punto, es posible que desee considerar vincular eventos recurrentes de alguna manera para que pueda eliminarlos todos.
fuente
Para los programadores .NET que están preparados para pagar algunas tarifas de licencia, puede encontrar útil Aspose.Network ... incluye una biblioteca compatible con iCalendar para citas periódicas .
fuente
Usted almacena los eventos en formato iCalendar directamente, lo que permite la repetición abierta, la localización de zonas horarias, etc.
Puede almacenarlos en un servidor CalDAV y luego, cuando desee mostrar los eventos, puede usar la opción del informe definido en CalDAV para pedirle al servidor que realice la expansión de los eventos recurrentes durante el período visualizado.
O bien, puede almacenarlos en una base de datos usted mismo y usar algún tipo de biblioteca de análisis iCalendar para hacer la expansión, sin necesidad de PUT / GET / REPORT para comunicarse con un servidor CalDAV de back-end. Probablemente esto sea más trabajo: estoy seguro de que los servidores CalDAV ocultan la complejidad en alguna parte.
Tener los eventos en formato iCalendar probablemente hará las cosas más simples a largo plazo ya que la gente siempre querrá que se exporten para poner otro software de todos modos.
fuente
¡Simplemente he implementado esta función! La lógica es la siguiente, primero necesitas dos tablas. RuleTable almacena eventos paternos generales o de reciclaje. ItemTable es eventos de ciclo almacenados. Por ejemplo, cuando crea un evento cíclico, la hora de inicio para el 6 de noviembre de 2015, la hora de finalización para el 6 de diciembre (o para siempre), ciclo durante una semana. Inserta datos en una tabla de reglas, los campos son los siguientes:
Ahora desea consultar datos del 20 de noviembre al 20 de diciembre. Puede escribir una función RecurringEventBE (inicio largo, final largo), en función del tiempo de inicio y finalización, WeekLy, puede calcular la colección que desea, <cycleA11.20, cycleA 11.27, cycleA 12.4 ......>. Además del 6 de noviembre, y el resto lo llamé un evento virtual. Cuando el usuario cambia el nombre de un evento virtual después (cicloA11.27, por ejemplo), inserta datos en una tabla de elementos. Los campos son los siguientes:
En la función RecurringEventBE (inicio largo, final largo), utiliza estos datos que cubren el evento virtual (cicloB11.27) perdón por mi inglés, lo intenté.
Este es mi RecurringEventBE :
fuente
¿Puedo sugerir que "sin fecha de finalización" se puede resolver a una fecha de finalización de fin de siglo Incluso para un evento diario, la cantidad de espacio sigue siendo barata.
fuente