Saya sedang membangun aplikasi kalender grup yang perlu mendukung acara yang berulang, tetapi semua solusi yang saya buat untuk menangani acara ini tampak seperti peretasan. Saya dapat membatasi seberapa jauh ke depan seseorang dapat melihat, dan kemudian menghasilkan semua acara sekaligus. Atau saya dapat menyimpan acara sebagai berulang dan menampilkannya secara dinamis ketika seseorang melihat ke depan pada kalender, tetapi saya harus mengubahnya menjadi acara normal jika seseorang ingin mengubah detail pada contoh acara tertentu.
Saya yakin ada cara yang lebih baik untuk melakukan ini, tetapi saya belum menemukannya. Apa cara terbaik untuk memodelkan acara berulang, di mana Anda dapat mengubah detail atau menghapus kejadian acara tertentu?
(Saya menggunakan Ruby, tapi tolong jangan biarkan itu membatasi jawaban Anda. Jika ada perpustakaan khusus-Ruby atau sesuatu, itu baik untuk diketahui.)
sumber
Martin Fowler - Acara Berulang untuk Kalender berisi beberapa wawasan dan pola yang menarik.
Permata keriting menerapkan pola ini.
sumber
Mungkin ada banyak masalah dengan acara yang berulang, izinkan saya menyoroti beberapa yang saya ketahui.
Solusi 1 - tidak ada contoh
Menyimpan data janji + pengulangan asli, jangan menyimpan semua instance.
Masalah:
Solusi 2 - instans toko
Simpan semuanya mulai dari 1, tetapi juga semua instance, ditautkan kembali ke janji temu yang asli.
Masalah:
Tentu saja, jika Anda tidak akan melakukan pengecualian, maka salah satu solusi harus baik-baik saja, dan Anda pada dasarnya memilih dari skenario pertukaran waktu / ruang.
sumber
Saya telah mengembangkan beberapa aplikasi berbasis kalender, dan juga menulis satu set komponen kalender JavaScript yang dapat digunakan kembali yang mendukung pengulangan. Saya menulis tinjauan umum tentang bagaimana merancang untuk pengulangan yang mungkin bermanfaat bagi seseorang. Meskipun ada beberapa bit yang khusus untuk perpustakaan yang saya tulis, sebagian besar saran yang ditawarkan bersifat umum untuk setiap implementasi kalender.
Beberapa poin kunci:
Ini adalah topik yang sangat rumit dengan banyak, banyak pendekatan yang valid untuk mengimplementasikannya. Saya akan mengatakan bahwa saya telah benar-benar menerapkan pengulangan beberapa kali dengan sukses, dan saya akan berhati-hati dalam mengambil saran mengenai hal ini dari siapa pun yang belum benar-benar melakukannya.
sumber
Anda mungkin ingin melihat implementasi perangkat lunak iCalendar atau standarnya sendiri (
RFC 2445RFC 5545 ). Satu- satunya yang terlintas dalam pikiran adalah proyek Mozilla http://www.mozilla.org/projects/calendar/ Sebuah pencarian cepat mengungkapkan http://icalendar.rubyforge.org/ juga.Opsi lain dapat dipertimbangkan tergantung pada bagaimana Anda akan menyimpan acara tersebut. Apakah Anda membangun skema basis data Anda sendiri? Menggunakan sesuatu berbasis iCalendar, dll?
sumber
Saya bekerja dengan yang berikut ini:
dan permata dalam proses yang memperluas formtastic dengan tipe input: recurring (
form.schedule :as => :recurring
), yang membuat antarmuka seperti iCal danbefore_filter
untuk membuat serialisasi tampilan menjadiIceCube
objek lagi, ghetto-ly.Ide saya adalah membuatnya mudah untuk menambahkan atribut berulang ke model dan menghubungkannya dengan mudah dalam tampilan. Semua dalam beberapa baris.
Jadi apa yang saya berikan? Atribut yang diindeks, dapat diedit, berulang.
events
toko satu hari misalnya, dan digunakan dalam tampilan kalender / penolong mengatakantask.schedule
menyimpan yaml'dIceCube
objek, sehingga Anda dapat melakukan panggilan seperti:task.schedule.next_suggestion
.Rekap: Saya menggunakan dua model, satu flat, untuk tampilan kalender, dan satu atribut untuk fungsi.
sumber
Saya menggunakan skema database seperti yang dijelaskan di bawah ini untuk menyimpan parameter pengulangan
http://github.com/bakineggs/recurring_events_for
Kemudian saya menggunakan runt untuk menghitung tanggal secara dinamis.
https://github.com/mlipper/runt
sumber
Perhatikan bahwa jika Anda mengizinkan aturan perulangan yang tidak berakhir, Anda harus memikirkan cara menampilkan informasi Anda yang sekarang jumlahnya tak terbatas.
Semoga itu bisa membantu!
sumber
Saya akan merekomendasikan menggunakan kekuatan perpustakaan tanggal dan semantik dari berbagai modul ruby. Peristiwa berulang benar-benar waktu, rentang tanggal (awal & akhir) dan biasanya satu hari dalam seminggu. Menggunakan tanggal & rentang Anda dapat menjawab pertanyaan apa pun:
Hasilkan semua hari acara, termasuk tahun kabisat!
sumber
Dari jawaban ini, saya semacam menyortir solusi. Saya sangat menyukai ide konsep tautan. Peristiwa berulang bisa menjadi daftar terkait, dengan ekor mengetahui aturan perulangannya. Mengubah satu peristiwa akan menjadi mudah, karena tautannya tetap di tempatnya, dan menghapus acara juga mudah - Anda cukup memutuskan tautan suatu acara, menghapusnya, dan menautkan kembali acara tersebut sebelum dan sesudahnya. Anda masih harus menanyakan acara berulang setiap kali seseorang melihat periode waktu baru yang belum pernah dilihat sebelumnya di kalender, tetapi jika tidak, ini cukup bersih.
sumber
Anda bisa menyimpan acara sebagai berulang, dan jika instance tertentu diedit, buat acara baru dengan ID acara yang sama. Kemudian saat mencari acara, cari semua acara dengan ID acara yang sama untuk mendapatkan semua informasi. Saya tidak yakin apakah Anda menggulung perpustakaan acara Anda sendiri, atau jika Anda menggunakan yang sudah ada sehingga tidak mungkin.
sumber
Periksa artikel di bawah ini untuk tiga perpustakaan ruby date / time yang bagus. ice_cube khususnya tampaknya merupakan pilihan yang kuat untuk aturan perulangan dan hal-hal lain yang diperlukan kalender acara. http://www.rubyinside.com/3-new-date-and-time-libraries-for-rubyists-3238.html
sumber
Dalam javascript:
Menangani jadwal berulang: http://bunkat.github.io/later/
Menangani acara dan ketergantungan yang kompleks antara jadwal tersebut: http://bunkat.github.io/schedule/
Pada dasarnya, Anda membuat aturan maka Anda meminta lib untuk menghitung peristiwa berulang N berikutnya (menentukan rentang tanggal atau tidak). Aturan dapat diuraikan / diserialisasi untuk menyimpannya ke dalam model Anda.
Jika Anda memiliki acara berulang dan hanya ingin memodifikasi satu pengulangan, Anda dapat menggunakan fungsi exception () untuk mengabaikan hari tertentu dan kemudian menambahkan acara yang dimodifikasi baru untuk entri ini.
Lib mendukung pola yang sangat kompleks, zona waktu, dan bahkan peristiwa kroning.
sumber
Menyimpan acara sebagai berulang dan menampilkannya secara dinamis, namun memungkinkan acara berulang untuk berisi daftar acara tertentu yang dapat menimpa informasi default pada hari tertentu.
Saat Anda menanyakan acara berulang, ia dapat memeriksa penimpaan spesifik untuk hari itu.
Jika pengguna melakukan perubahan, maka Anda dapat bertanya apakah dia ingin memperbarui untuk semua instance (detail default) atau hanya hari itu (membuat acara spesifik baru dan menambahkannya ke daftar).
Jika seorang pengguna meminta untuk menghapus semua perulangan dari acara ini Anda juga memiliki daftar spesifik untuk diberikan dan dapat menghapusnya dengan mudah.
Satu-satunya kasus yang bermasalah adalah jika pengguna ingin memperbarui acara ini dan semua acara mendatang. Dalam hal ini Anda harus membagi acara berulang menjadi dua. Pada titik ini Anda mungkin ingin mempertimbangkan menautkan acara yang berulang dengan cara tertentu sehingga Anda dapat menghapus semuanya.
sumber
Untuk .NET programmer yang siap membayar beberapa biaya lisensi, Anda mungkin menemukan Aspose.Network bermanfaat ... ini mencakup perpustakaan yang kompatibel dengan iCalendar untuk janji temu berulang.
sumber
Anda menyimpan acara dalam format iCalendar secara langsung, yang memungkinkan untuk pengulangan terbuka, lokalisasi zona waktu dan sebagainya.
Anda bisa menyimpan ini di server CalDAV dan kemudian ketika Anda ingin menampilkan acara, Anda bisa menggunakan opsi laporan yang ditentukan di CalDAV untuk meminta server melakukan perluasan acara berulang di seluruh periode yang dilihat.
Atau Anda dapat menyimpannya dalam database sendiri dan menggunakan semacam parsing pustaka iCalendar untuk melakukan ekspansi, tanpa perlu PUT / GET / LAPORAN untuk berbicara dengan server CalDAV backend. Ini mungkin lebih banyak pekerjaan - saya yakin server CalDAV menyembunyikan kompleksitas di suatu tempat.
Memiliki acara dalam format iCalendar mungkin akan membuat hal-hal yang lebih sederhana dalam jangka panjang karena orang akan selalu ingin mereka diekspor untuk dimasukkan ke perangkat lunak lain.
sumber
Saya telah Cukup menerapkan fitur ini! Logikanya adalah sebagai berikut, pertama Anda perlu dua tabel. Toko RuleTable umum atau mendaur ulang acara ayah. ItemTable adalah peristiwa siklus yang disimpan. Misalnya, ketika Anda membuat acara siklik, waktu mulai untuk 6 November 2015, waktu akhir untuk 6 Desember (atau selamanya), siklus selama satu minggu. Anda memasukkan data ke dalam RuleTable, bidang adalah sebagai berikut:
Sekarang Anda ingin menanyakan data 20 November hingga 20 Desember. Anda dapat menulis fungsi RecurringEventBE (awal, akhir), berdasarkan waktu mulai dan berakhir, WeekLy, Anda dapat menghitung koleksi yang Anda inginkan, <cycleA11.20, cycleA 11.27, cycleA 12.4 ......>. Selain 6 November, dan sisanya saya memanggilnya acara virtual. Ketika pengguna mengubah nama peristiwa virtual 'setelah (cycleA11.27 misalnya), Anda memasukkan data ke dalam ItemTable. Fields adalah sebagai berikut:
Dalam fungsi RecurringEventBE (awal, akhir), Anda menggunakan data ini yang meliputi peristiwa virtual (cycleB11.27) maaf tentang bahasa Inggris saya, saya mencoba.
Ini adalah RecurringEventBE saya :
sumber
Bolehkah saya menyarankan bahwa "tidak ada tanggal akhir" dapat diselesaikan ke tanggal akhir pada akhir abad ini. Bahkan untuk acara harian jumlah ruang tetap murah.
sumber