我正在构建一个需要支持重复事件的组日历应用程序,但我提出的处理这些事件的所有解决方案似乎都很简单。我可以限制一个人可以看多远的未来,然后一次性生成所有事件。或者,我可以将事件存储为重复的,并在日历上动态显示它们,但如果有人想更改事件的特定实例的细节,则必须将它们转换为正常事件。

我相信有更好的办法,但我还没找到。对重复发生的事件建模的最佳方法是什么?在这种方法中,您可以更改或删除特定事件实例的细节?

(我使用Ruby,但请不要让这限制了你的回答。如果有ruby特定的库或其他东西,那么最好知道。)


当前回答

我正在处理以下问题:

http://github.com/elevation/event_calendar -日历的模型和助手 http://github.com/seejohnrun/ice_cube -令人敬畏的循环宝石 http://github.com/justinfrench/formtastic -简单表单

以及一个正在进行的gem,它将formtastic扩展为一个输入类型:recurrent (form。schedule:as =>:循环),它会呈现一个类似ical的界面和一个before_filter来将视图再次序列化到一个IceCube对象中。

我的想法是使它难以置信的容易添加循环属性到一个模型,并在视图中容易地连接它。都在几行字里。


这给了我什么?索引,可编辑,循环属性。

Events存储单个日实例,并在日历视图/helper中使用 说的任务。schedule存储了yaml的IceCube对象,所以你可以像这样调用:task.schedule.next_suggestion。

概述:我使用两个模型,一个平面,日历显示,和一个属性的功能。

其他回答

在javascript中:

处理重复的日程安排: http://bunkat.github.io/later/

处理这些计划之间的复杂事件和依赖关系: http://bunkat.github.io/schedule/

基本上,您创建规则,然后要求库计算接下来的N个重复事件(是否指定日期范围)。可以对规则进行解析/序列化,以便将它们保存到模型中。

如果您有一个重复发生的事件,并且只想修改其中一个重复发生的事件,您可以使用except()函数来取消特定的一天,然后为该条目添加一个新的修改过的事件。

库支持非常复杂的模式,时区,甚至croning事件。

I would use a 'link' concept for all future recurring events. They are dynamically displayed in the calendar and link back to a single reference object. When events have taken place the link is broken and the event becomes a standalone instance. If you attempt to edit a recurring event then prompt to change all future items (i.e. change single linked reference) or change just that instance (in which case convert this to a standalone instance and then make change). The latter cased is slightly problematic as you need to keep track in your recurring list of all future events that were converted to single instance. But, this is entirely do-able.

因此,在本质上,有两类事件-单个实例和重复事件。

您可以将事件存储为重复的,如果编辑了特定实例,则创建具有相同事件ID的新事件。然后,在查找事件时,搜索具有相同事件ID的所有事件以获得所有信息。我不确定您是否滚动了自己的事件库,或者您是否正在使用现有的事件库,因此可能无法实现。

查看下面的文章,了解三个优秀的ruby日期/时间库。 对于递归规则和事件日历需要的其他东西,Ice_cube似乎是一个可靠的选择。 http://www.rubyinside.com/3-new-date-and-time-libraries-for-rubyists-3238.html

您可能想要查看iCalendar软件实现或标准本身(RFC 2445 RFC 5545)。 很快想到的是Mozilla项目http://www.mozilla.org/projects/calendar/,快速搜索也会显示http://icalendar.rubyforge.org/。

可以考虑其他选项,这取决于您将如何存储事件。您正在构建自己的数据库模式吗?使用基于icalendar的软件,等等?