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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам