Buduję aplikację kalendarza grupowego, która musi obsługiwać powtarzające się wydarzenia, ale wszystkie rozwiązania, które wymyśliłem, aby obsłużyć te wydarzenia, wydają się być włamaniem. Mogę ograniczyć, jak daleko można spojrzeć, a następnie wygenerować wszystkie zdarzenia naraz. Lub mogę przechowywać wydarzenia jako powtarzające się i wyświetlać je dynamicznie, gdy spojrzy się na kalendarz, ale będę musiał przekonwertować je na normalne wydarzenie, jeśli ktoś chce zmienić szczegóły dotyczące konkretnego wystąpienia wydarzenia.
Jestem pewien, że jest na to lepszy sposób, ale jeszcze go nie znalazłem. Jaki jest najlepszy sposób modelowania powtarzających się zdarzeń, w którym można zmienić szczegóły lub usunąć poszczególne wystąpienia zdarzeń?
(Używam Ruby, ale nie pozwól, by to ograniczało twoją odpowiedź. Jeśli jest jednak biblioteka specyficzna dla Ruby lub coś takiego, to dobrze wiedzieć.)
źródło
Martin Fowler - Cykliczne wydarzenia dla kalendarzy zawiera kilka ciekawych spostrzeżeń i wzorów.
Klejnot Runt wdraża ten wzór.
źródło
Może występować wiele problemów z powtarzającymi się wydarzeniami, pozwól mi podkreślić kilka, które znam.
Rozwiązanie 1 - brak wystąpień
Przechowuj oryginalne spotkanie + dane o cyklach, nie przechowuj wszystkich wystąpień.
Problemy:
Rozwiązanie 2 - przechowuj instancje
Przechowuj wszystko od 1, ale także wszystkie wystąpienia, powiązane z pierwotnym terminem.
Problemy:
Oczywiście, jeśli nie zamierzasz robić wyjątków, każde z tych rozwiązań powinno być w porządku i zasadniczo wybierasz ze scenariusza kompromisu czas / przestrzeń.
źródło
Opracowałem wiele aplikacji opartych na kalendarzach, a także jestem autorem zestawu składników kalendarza JavaScript wielokrotnego użytku, które obsługują powtarzanie. Napisałem przegląd tego, jak zaprojektować wznowienie, które może być komuś pomocne. Chociaż jest kilka bitów, które są specyficzne dla biblioteki, którą napisałem, zdecydowana większość udzielonych porad dotyczy wszystkich implementacji kalendarza.
Niektóre kluczowe punkty:
To naprawdę skomplikowany temat z wieloma, wieloma ważnymi podejściami do jego wdrożenia. Powiem, że kilkakrotnie z powodzeniem wdrożyłem wznowienie i nieufnie będę udzielał porad na ten temat każdemu, kto tego nie zrobił.
źródło
Możesz przyjrzeć się implementacjom oprogramowania iCalendar lub samemu standardowi (
RFC 2445RFC 5545 ). Do głowy przychodzą szybko projekty Mozilli http://www.mozilla.org/projects/calendar/ Szybkie wyszukiwanie ujawnia również http://icalendar.rubyforge.org/ .Można rozważyć inne opcje w zależności od tego, jak zamierzasz przechowywać wydarzenia. Czy budujesz własny schemat bazy danych? Używasz czegoś opartego na iCalendar itp.?
źródło
Pracuję z następującymi:
oraz klejnot w toku, który rozszerza formtastic o typ wejściowy: recurring (
form.schedule :as => :recurring
), który renderuje interfejs podobny do iCal ibefore_filter
ponownie serializuje widok wIceCube
obiekt, getto.Moim pomysłem jest ułatwienie dodawania powtarzających się atrybutów do modelu i łatwe łączenie go w widoku. Wszystko w kilku wierszach.
Co mi to daje? Atrybuty indeksowane, edytowalne, cykliczne.
events
sklepy pojedyncza instancja dni i jest wykorzystywane w widoku kalendarza / pomocnik powiedziećtask.schedule
Przechowuje yaml'dIceCube
obiektu, dzięki czemu można zrobić połączeń, takich jak:task.schedule.next_suggestion
.Podsumowanie: używam dwóch modeli, jednego płaskiego, do wyświetlania kalendarza i jednego atrybutu dla funkcjonalności.
źródło
Korzystam ze schematu bazy danych, jak opisano poniżej, do przechowywania parametrów cykliczności
http://github.com/bakineggs/recurring_events_for
Następnie używam runt do dynamicznego obliczania dat.
https://github.com/mlipper/runt
źródło
Pamiętaj, że jeśli zezwolisz na reguły powtarzania, które się nie kończą, musisz pomyśleć o tym, jak wyświetlić teraz nieskończoną ilość informacji.
Mam nadzieję, że to pomaga!
źródło
Poleciłbym użyć mocy biblioteki dat i semantyki modułu zakresu ruby. Cykliczne wydarzenie to tak naprawdę czas, zakres dat (początek i koniec) i zazwyczaj jeden dzień tygodnia. Korzystając z daty i zakresu, możesz odpowiedzieć na każde pytanie:
Produkuje wszystkie dni wydarzenia, w tym rok przestępny!
źródło
Z tych odpowiedzi wyszukałem rozwiązanie. Naprawdę podoba mi się pomysł koncepcji linku. Powtarzające się zdarzenia mogą być listą połączoną, a ogon zna swoją zasadę powtarzania. Zmiana jednego wydarzenia byłaby wówczas łatwa, ponieważ linki pozostają na miejscu, a usuwanie wydarzenia jest również łatwe - wystarczy odłączyć wydarzenie, usunąć je i ponownie połączyć wydarzenie przed i po nim. Nadal musisz sprawdzać powtarzające się zdarzenia za każdym razem, gdy ktoś patrzy na nowy okres, którego nigdy wcześniej nie oglądano w kalendarzu, ale poza tym jest to całkiem czyste.
źródło
Możesz przechowywać zdarzenia jako powtarzające się, a jeśli dana instancja została edytowana, utwórz nowe zdarzenie o tym samym identyfikatorze. Następnie, patrząc na wydarzenie, wyszukaj wszystkie zdarzenia o tym samym identyfikatorze zdarzenia, aby uzyskać wszystkie informacje. Nie jestem pewien, czy utworzyłeś własną bibliotekę wydarzeń, czy używasz już istniejącej, więc może to nie być możliwe.
źródło
Sprawdź poniższy artykuł pod kątem trzech dobrych bibliotek daty / godziny ruby. W szczególności ice_cube wydaje się być dobrym wyborem dla reguł powtarzania i innych rzeczy, których potrzebuje kalendarz wydarzeń. http://www.rubyinside.com/3-new-date-and-time-libraries-for-rubyists-3238.html
źródło
W javascript:
Obsługa harmonogramów cyklicznych: http://bunkat.github.io/later/
Obsługa złożonych zdarzeń i zależności między tymi harmonogramami: http://bunkat.github.io/schedule/
Zasadniczo, tworzysz reguły, a następnie prosisz bibliotekę, aby obliczyła N kolejnych cyklicznych zdarzeń (określając zakres dat lub nie). Reguły można analizować / serializować w celu zapisania ich w modelu.
Jeśli masz wydarzenie cykliczne i chcesz zmodyfikować tylko jedno powtórzenie, możesz użyć funkcji wyjątku (), aby zamknąć dany dzień, a następnie dodać nowe zmodyfikowane zdarzenie dla tego wpisu.
Biblioteka obsługuje bardzo skomplikowane wzorce, strefy czasowe, a nawet croning.
źródło
Przechowuj zdarzenia jako powtarzające się i wyświetlaj je dynamicznie, jednak pozwól, aby cykliczne zdarzenie zawierało listę konkretnych zdarzeń, które mogą zastąpić domyślne informacje w danym dniu.
Po zapytaniu o powtarzające się zdarzenie może sprawdzić, czy nie ma określonego zastąpienia na ten dzień.
Jeśli użytkownik wprowadza zmiany, możesz zapytać, czy chce dokonać aktualizacji dla wszystkich instancji (szczegóły domyślne), czy tylko tego dnia (zrób nowe konkretne zdarzenie i dodaj je do listy).
Jeśli użytkownik poprosi o usunięcie wszystkich powtórzeń tego zdarzenia, masz również listę szczegółów do pod ręką i możesz je łatwo usunąć.
Jedynym problematycznym przypadkiem jest sytuacja, gdy użytkownik chce zaktualizować to zdarzenie i wszystkie przyszłe zdarzenia. W takim przypadku musisz podzielić wydarzenie cykliczne na dwa. W tym momencie możesz rozważyć powiązanie powtarzających się zdarzeń, aby móc je wszystkie usunąć.
źródło
Dla programistów .NET, którzy są gotowi uiścić pewne opłaty licencyjne, Aspose.Network może okazać się przydatny ... zawiera bibliotekę kompatybilną z iCalendar do cyklicznych spotkań.
źródło
Zdarzenia są zapisywane bezpośrednio w formacie iCalendar, co pozwala na powtarzalne powtarzanie, lokalizację stref czasowych i tak dalej.
Można je zapisać na serwerze CalDAV, a następnie, aby wyświetlić zdarzenia, można skorzystać z opcji raportu zdefiniowanej w CalDAV, aby poprosić serwer o rozwinięcie cyklicznych zdarzeń w całym oglądanym okresie.
Lub możesz sam przechowywać je w bazie danych i użyć jakiegoś rodzaju biblioteki parsowania iCalendar, aby wykonać rozbudowę, bez potrzeby używania PUT / GET / REPORT do komunikacji z serwerem CalDAV zaplecza. To chyba więcej pracy - jestem pewien, że serwery CalDAV gdzieś ukrywają złożoność.
Posiadanie wydarzeń w formacie iCalendar prawdopodobnie na dłuższą metę uprości sprawę, ponieważ ludzie zawsze będą chcieli eksportować je w celu zainstalowania innego oprogramowania.
źródło
Właśnie zaimplementowałem tę funkcję! Logika jest następująca: najpierw potrzebujesz dwóch tabel. RuleTable przechowuj ogólne lub przetwarzaj zdarzenia ojcowskie. ItemTable to przechowywane zdarzenia cykliczne. Na przykład, gdy tworzysz wydarzenie cykliczne, czas rozpoczęcia 6 listopada 2015 r., Czas zakończenia 6 grudnia (lub na zawsze), cykl na tydzień. Wstawiasz dane do tabeli reguł, pola są następujące:
Teraz chcesz wysłać zapytanie do danych od 20 listopada do 20 grudnia. Możesz napisać funkcję RecurringEventBE (długi start, długi koniec), na podstawie czasu rozpoczęcia i zakończenia, WeekLy, możesz obliczyć żądaną kolekcję, <cykl A11.20, cykl A 11,27, cykl A 12,4 ......>. Oprócz 6 listopada, a resztę nazwałem go wirtualnym wydarzeniem. Gdy użytkownik zmienia nazwę zdarzenia wirtualnego po (na przykład cykl A1.11.2), wstawiasz dane do tabeli pozycji. Pola są następujące:
W funkcji RecurringEventBE (długi początek, długi koniec) używasz tych danych obejmujących zdarzenie wirtualne (cykl B11.27) przepraszam za mój angielski, próbowałem.
To jest mój RecurringEventBE :
źródło
Chciałbym zasugerować, że „brak daty końcowej” można rozwiązać na datę końcową pod koniec wieku. Nawet na codzienne wydarzenie ilość miejsca pozostaje tania.
źródło