Эффективное получение расписаний 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

Это кажется ужасно неэффективным, но я не уверен, как еще это сделать.


person 99miles    schedule 30.05.2012    source источник
comment
Что вы в итоге сделали по этому поводу? я застрял в том же месте? спасибо   -  person    schedule 15.10.2016


Ответы (2)


Это один из подходов, но чаще всего люди в конечном итоге денормализуют свои расписания в формат, который удобно запрашивать.

У вас может быть коллекция, называемая чем-то вроде ScheduleOccurrences, которую вы создаете каждую неделю /, а затем вместо этого запрашиваете ее.

К сожалению, ему приходится работать таким образом, но использование iCal для управления расписаниями привело к тому, что IceCube необходимо форматировать свои данные определенным образом (в частности, способами, которые могут соответствовать требованиям iCal RFC).

Недавно я размышлял о том, как будет выглядеть библиотека, которая избавится от некоторых из этих ограничений, для большей гибкости, но это определенно все еще немного не так.

Надеюсь это поможет

person John    schedule 04.06.2012
comment
Спасибо, Джон. Но что происходит, когда пользователь просматривает календарь на прошедшую неделю? - person 99miles; 04.06.2012
comment
Может быть, вы могли бы генерировать ScheduleOccurrences по мере необходимости? Поэтому, если кто-то запрашивает расписание на следующую неделю, сервер может сохранить строки. В настоящее время я пытаюсь понять, как повторять события в моем приложении rails... - person mscriven; 30.03.2014

Я столкнулся с аналогичной проблемой, и вот мой подход:

Создайте столбец в таблице событий для хранения даты следующего события и напишите метод, который сохраняет это значение after_save. (метод доступен через ice_cube. Возможно, индексный столбец также для более быстрого запроса.)

Затем вы можете запросить в базе данных события, происходящие в нужный вам период времени. Смотри ниже:

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

Храните EventOccurrences в отдельной таблице.

Обновите столбец next_occurrence для строк, возвращенных вам по вашему запросу. Или что-то подобное. Это работает для меня, потому что я выполняю ежедневную работу, поэтому обновление next_occurrence будет выполняться регулярно. Но вам может понадобиться немного подправить.

person babiesinspace    schedule 01.06.2018
comment
Это был ответ, который я еще не полностью проверил. Я пересмотрел его, чтобы попытаться быть более ясным. - person babiesinspace; 02.06.2018