Я создаю приложение для группового календаря, которое должно поддерживать повторяющиеся события, но все решения, которые я придумал для обработки этих событий, кажутся хаком. Я могу ограничить, насколько далеко можно заглянуть вперед, а затем сгенерировать все события одновременно. Или я могу сохранить события как повторяющиеся и динамически отображать их, когда кто-то смотрит в календарь, но мне придется преобразовать их в обычное событие, если кто-то захочет изменить детали конкретного экземпляра события.
Я уверен, что есть лучший способ сделать это, но я еще не нашел это. Каков наилучший способ моделирования повторяющихся событий, где вы можете изменить детали или удалить отдельные экземпляры событий?
(Я использую Ruby, но, пожалуйста, не позволяйте этому ограничивать ваш ответ. Однако, если есть библиотека для Ruby или что-то еще, это полезно знать.)
источник
Мартин Фаулер - Повторяющиеся события для календарей содержит некоторые интересные идеи и шаблоны.
Runt Gem реализует этот шаблон.
источник
С повторяющимися событиями может быть много проблем, позвольте мне выделить некоторые из них, о которых я знаю.
Решение 1 - нет случаев
Сохранять исходные данные о встрече + повторения, не хранить все экземпляры.
Проблемы:
Решение 2 - хранить экземпляры
Сохраните все, начиная с 1, но также и все экземпляры, связанные с исходной встречей.
Проблемы:
Конечно, если вы не собираетесь делать исключения, тогда любое решение должно быть подходящим, и вы в основном выбираете из сценария временного / пространственного компромисса.
источник
Я разработал несколько приложений на основе календаря, а также создал набор повторно используемых компонентов календаря JavaScript, которые поддерживают повторяемость. Я написал обзор того, как спроектировать повторение, которое может быть полезным для кого-то. Хотя есть несколько битов, специфичных для библиотеки, которую я написал, подавляющее большинство предлагаемых советов является общим для любой реализации календаря.
Некоторые из ключевых моментов:
Это действительно сложная тема с множеством подходящих подходов к ее реализации. Я скажу, что на самом деле я несколько раз успешно реализовывал повторение, и я бы с осторожностью посоветовался по этому вопросу со всеми, кто этого не делал.
источник
Возможно, вы захотите взглянуть на реализации программного обеспечения iCalendar или сам стандарт (
RFC 2445RFC 5545 ). Быстро всплывают проекты Mozilla http://www.mozilla.org/projects/calendar/ Быстрый поиск также показывает http://icalendar.rubyforge.org/ .Другие варианты могут быть рассмотрены в зависимости от того, как вы собираетесь хранить события. Вы строите свою собственную схему базы данных? Используете что-то на основе iCalendar и т. Д.?
источник
Я работаю со следующим:
и жемчужина в процессе разработки, которая расширяет форму с помощью типа ввода: recurring (
form.schedule :as => :recurring
), который визуализирует интерфейс, подобный iCal, и abefore_filter
дляIceCube
повторной сериализации представления в объект, гетто-ly.Моя идея состоит в том, чтобы невероятно легко добавлять повторяющиеся атрибуты в модель и легко подключать ее в представлении. Все в пару строк.
Так что это мне дает? Индексированные, редактируемые, повторяющиеся атрибуты.
events
хранит один экземпляр дня, и используются в календаре / помощник сказатьtask.schedule
хранит в yaml'dIceCube
объект, так что вы можете делать звонки , как:task.schedule.next_suggestion
.Напомним: я использую две модели: одну плоскую для отображения календаря и одну атрибутную для функциональности.
источник
Я использую схему базы данных, как описано ниже, для хранения параметров повторения
http://github.com/bakineggs/recurring_events_for
Затем я использую runt для динамического вычисления дат.
https://github.com/mlipper/runt
источник
Обратите внимание, что если вы разрешаете правила повторения, которые не заканчиваются, вам нужно подумать о том, как отображать бесконечное количество информации.
Надеюсь, это поможет!
источник
Я бы порекомендовал использовать всю мощь библиотеки дат и семантику модуля диапазона ruby. Повторяющееся событие - это действительно время, диапазон дат (начало и конец) и, как правило, один день недели. Используя дату и диапазон, вы можете ответить на любой вопрос:
Производит все дни мероприятия, включая високосный год!
источник
Из этих ответов я как бы отсеял решение. Мне очень нравится идея концепции ссылки. Повторяющиеся события могут быть связанным списком, причем хвост знает свое правило повторения. В этом случае изменение одного события будет простым, поскольку ссылки остаются на месте, а удаление события также легко - вы просто отсоединяете событие, удаляете его и повторно связываете событие до и после него. Вам по-прежнему приходится запрашивать повторяющиеся события каждый раз, когда кто-то смотрит на новый период времени, который никогда не просматривался в календаре, но в остальном это довольно чисто.
источник
Вы можете сохранить события как повторяющиеся, и, если конкретный экземпляр был отредактирован, создать новое событие с тем же идентификатором события. Затем при поиске события найдите все события с одинаковым идентификатором события, чтобы получить всю информацию. Я не уверен, что вы свернули свою собственную библиотеку событий или используете уже существующую, так что это может оказаться невозможным.
источник
Проверьте статью ниже для трех хороших ruby библиотек даты / времени. В частности, ice_cube кажется хорошим выбором для правил повторения и других вещей, которые потребуются в календаре событий. http://www.rubyinside.com/3-new-date-and-time-libraries-for-rubyists-3238.html
источник
В JavaScript:
Обработка повторяющихся расписаний: http://bunkat.github.io/later/
Обработка сложных событий и зависимостей между этими расписаниями: http://bunkat.github.io/schedule/
По сути, вы создаете правила, а затем просите библиотеку вычислить следующие N повторяющихся событий (с указанием диапазона дат или нет). Правила могут быть проанализированы / сериализованы для сохранения их в вашей модели.
Если у вас есть повторяющееся событие и вы хотите изменить только одно повторение, вы можете использовать функцию исключения (), чтобы отменить определенный день, а затем добавить новое измененное событие для этой записи.
Библиотека поддерживает очень сложные паттерны, часовые пояса и даже хронологические события.
источник
Сохраняйте события как повторяющиеся и динамически отображайте их, однако позволяйте повторяющимся событиям содержать список определенных событий, которые могут переопределять информацию по умолчанию в определенный день.
Когда вы запрашиваете повторяющееся событие, оно может проверить конкретное переопределение для этого дня.
Если пользователь вносит изменения, то вы можете спросить, хочет ли он обновить все экземпляры (данные по умолчанию) или только на этот день (создать новое конкретное событие и добавить его в список).
Если пользователь просит удалить все повторения этого события, у вас также есть список специфических особенностей, и вы можете легко их удалить.
Единственный проблемный случай - пользователь хочет обновить это событие и все будущие события. В этом случае вам придется разделить повторяющееся событие на две части. На этом этапе вы можете захотеть связать повторяющиеся события каким-либо образом, чтобы вы могли удалить их все.
источник
Для программистов .NET, которые готовы платить некоторые лицензионные сборы, вы можете найти Aspose.Network полезным ... он включает в себя совместимую с iCalendar библиотеку для повторяющихся встреч.
источник
Вы сохраняете события непосредственно в формате iCalendar, что позволяет осуществлять повторение в открытом формате, локализацию часового пояса и т. Д.
Вы можете сохранить их на сервере CalDAV, а затем, когда вы захотите отобразить события, вы можете использовать опцию отчета, определенную в CalDAV, чтобы попросить сервер выполнить расширение повторяющихся событий за просматриваемый период.
Или вы можете сохранить их в базе данных самостоятельно и использовать некую библиотеку синтаксического анализа iCalendar для расширения, не нуждаясь в PUT / GET / REPORT для связи с внутренним сервером CalDAV. Это, вероятно, больше работы - я уверен, что серверы CalDAV где-то скрывают сложность.
Наличие событий в формате iCalendar, вероятно, в конечном итоге упростит ситуацию, так как люди всегда будут хотеть, чтобы их экспортировали для установки другого программного обеспечения в любом случае.
источник
Я просто реализовал эту функцию! Логика такова, для начала нужно две таблицы. RuleTable хранит общие или перезапускает отцовские события. ItemTable - это сохраненные события цикла. Например, при создании циклического события время начала 6 ноября 2015 г., время окончания цикла 6 декабря (или навсегда) для одной недели. Вы вставляете данные в RuleTable, поля следующие:
Теперь вы хотите запросить данные с 20 ноября по 20 декабря. Вы можете написать функцию RecurringEventBE (длинный старт, длинный конец), основываясь на времени начала и окончания, WeekLy, вы можете рассчитать желаемую коллекцию, <циклA11.20, цикл А 11.27, цикл А 12.4 ......>. Помимо 6 ноября, а остальные я назвал его виртуальным событием. Когда пользователь изменяет имя виртуального события после (например, cycleA11.27), вы вставляете данные в ItemTable. Поля следующие:
В функции RecurringEventBE (long start, long end) вы используете эти данные, охватывающие виртуальное событие (cycleB11.27), извините за мой английский, я пробовал.
Это мой RecurringEventBE :
источник
Могу ли я предположить, что «конечная дата не может быть решена» до конечной даты в конце века. Даже для ежедневного мероприятия количество места остается дешевым.
источник