在给定时间段内有效地检索ice_cube计划

时间:2012-05-30 22:20:38

标签: ruby-on-rails ruby-on-rails-3 ice-cube

我正在考虑使用Ice Cube https://github.com/seejohnrun/ice_cube进行重复活动。 我的问题是,如果我需要获得在给定时间段内(例如,在一天或一周内)发生的任何事件,是否有更好的方式,而不是像这样循环它们:

items = Records.find(:all)
items.each do |item|
  schedule = item.schedule
  if schedule.occurs_on?(Date.new)
      #if today is a recurrence, add to array
  end
end

这看起来非常低效,但我不确定该怎么做。

2 个答案:

答案 0 :(得分:4)

这是一种方法 - 但人们更常做的事情是最终将他们的日程表非规范化为一种方便查询的格式。

您可能有一个名为ScheduleOccurrences的集合 - 您每周构建/然后再查询。

不幸的是它必须以这种方式工作,但坚持iCal管理时间表的方式导致IceCube需要以某种方式格式化其数据(特别是可以符合iCal RFC要求的方式)。 / p>

我最近一直在思考一个库看起来像是什么样的东西会震撼其中的一些限制,为了更大的灵活性 - 但它肯定还有点偏离。

希望这有帮助

答案 1 :(得分:0)

我遇到了类似的问题,这是我的方法:

在Event表上创建一个列以存储下一个出现日期,并编写一个存储该值after_save的方法。 (通过ice_cube提供的方法。也许是索引列,以便更快地查询。)

然后,您可以在数据库中查询所需时间范围内发生的事件。见下文:

Event.where(next_occurrence: Date.today.all_day)

将EventOccurrences存储在单独的表中。

更新查询返回给您的行的next_occurrence列。或类似的东西。这对我有用,因为我正在运行日常工作,因此更新next_occurrence将定期运行。但你可能需要调整一下。