我确信有更好的方法来处理这个问题,但我还没有找到。怎么样才能最好地模拟重复事件,以便您可以更改特定事件实例的详细信息或删除它们?
(我使用Ruby语言编写,但请不要让这限制您的答案。如果有Ruby特定的库或其他内容可用,那么这很重要。)
我开发了多个基于日历的应用程序,并编写了一组可重用的JavaScript日历组件,支持重复。我撰写了一篇有关如何设计重复事件的概述,可能对某些人有帮助。虽然其中有一些内容是特定于我编写的库的,但提供的大部分建议适用于任何日历实现。
以下是一些关键点:
这是一个非常复杂的话题,有许多有效的实现方法。我可以说,我已经成功地实现了多次重复,因此我会谨慎地从任何未真正实践过此主题的人那里获得建议。
有许多关于定期事件的问题,让我重点介绍一些我知道的。
存储原始约会+重复数据,不要存储所有实例。
问题:
存储来自1的所有内容,以及所有实例,链接回原始约会。
问题:
当然,如果您不打算进行异常处理,则两种解决方案都应该可以,您基本上可以从时间/空间权衡方案中进行选择。
我正在使用以下内容:
还有一个正在进行中的宝石,可以通过扩展带有输入类型:recurring的formtastic(form.schedule :as => :recurring
)来呈现类似iCal的接口,并使用before_filter
将视图序列化为IceCube
对象。
我的想法是使添加重复属性到模型并在视图中轻松连接变得非常容易。一切都只需要几行代码。
那么这给我的是什么?可索引、可编辑、可重复的属性。
events
存储一个单一的日期实例,并用于日历视图/帮手。例如,task.schedule
存储了 yaml 格式的 IceCube
对象,所以您可以执行像 task.schedule.next_suggestion
这样的调用。
总结:我使用了两个模型,一个是扁平的用于日历显示,另一个是有属性的用于功能。
请注意,如果允许无限期的循环规则,则必须考虑如何显示无限数量的信息。
希望这有所帮助!
我建议使用日期库和ruby的范围模块的语义来实现。一个重复事件实际上是一个时间、一个日期范围(开始和结束),通常还有一周中的某个单独的日期。使用日期和范围,你可以回答任何问题:
#!/usr/bin/ruby
require 'date'
start_date = Date.parse('2008-01-01')
end_date = Date.parse('2008-04-01')
wday = 5 # friday
(start_date..end_date).select{|d| d.wday == wday}.map{|d| d.to_s}.inspect
生成整个事件的所有日期,包括闰年!
# =>"[\"2008-01-04\", \"2008-01-11\", \"2008-01-18\", \"2008-01-25\", \"2008-02-01\", \"2008-02-08\", \"2008-02-15\", \"2008-02-22\", \"2008-02-29\", \"2008-03-07\", \"2008-03-14\", \"2008-03-21\", \"2008-03-28\"]"
从这些答案中,我已经筛选出了一个解决方案。我非常喜欢链接概念的想法。重复事件可以是一个链接列表,尾巴知道它的重复规则。更改一个事件将变得很容易,因为链接保持不变,删除一个事件也很容易-您只需取消链接一个事件,删除它,然后重新链接它之前和之后的事件。每次有人查看日历上以前从未查看过的新时间段时,仍然必须查询重复事件,但除此之外,这非常干净。