Эффективное получение расписаний 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 будет выполняться регулярно. Но вам может понадобиться немного подправить.