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

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

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


当前回答

我使用如下所述的数据库模式来存储递归参数

http://github.com/bakineggs/recurring_events_for

然后使用runt动态计算日期。

https://github.com/mlipper/runt

其他回答

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

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

如果你有一个没有结束日期的重复约会怎么办?虽然空间很便宜,但你没有无限的空间,所以解决方案2在那里是行不通的……

我建议,“没有结束日期”可以解决到本世纪末的结束日期。即使是日常活动,场地数量也很便宜。

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

重复事件可能会有很多问题,让我强调一些我所知道的。

解决方案1 -没有实例

存储原始约会+复发数据,不存储所有实例。

问题:

当你需要的时候,你必须在一个日期窗口中计算所有的实例,成本很高 无法处理异常(即。你删除一个实例,或者移动它,或者更确切地说,你不能用这个解决方案这样做)

解决方案2 -存储实例

存储从1开始的所有内容,以及链接回原始约会的所有实例。

问题:

占用很大的空间(但是空间很便宜,所以很小) 必须优雅地处理异常,特别是在做出异常后返回并编辑原始约会时。例如,如果您将第三个实例向前移动一天,那么如果您返回并编辑原始约会的时间,在原始日期重新插入另一个实例,并保留已移动的实例,该怎么办?断开移动的那个?试着适当地改变移动的那个?

当然,如果不打算使用异常,那么任何一种解决方案都可以,基本上可以从时间/空间权衡方案中进行选择。

我正在处理以下问题:

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。

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