Вам не нужно ничего необычного, но вам нужно правильно спланировать свои структуры данных.
Если вы будете придерживаться строгой методологии «одно событие - одна запись», вы сможете значительно оптимизировать свой поиск. Простой подход - ввести столбец календарного месяца, который можно проиндексировать, и использовать его в области для извлечения событий:
@events = @user.events.where(:yearmonth => yearmonth)
Столбец yearmonth
содержит YYYYMM
отформатированные значения. При необходимости вы также можете индексировать по дате или неделе.
Повторяющееся событие будет иметь множество дочерних событий, обычно одно событие относится к предыдущему экземпляру этого типа события. Вам придется повторять это в течение достаточно длительного периода времени, что может привести к большому количеству записей, но предварительно вычислить его, вероятно, проще, чем загружать все события для пользователя и пытаться выяснить, что происходит в данном случае. календарный месяц.
Настольные или телефонные приложения-календари могут хранить весь набор данных событий в памяти, поскольку обычно он предназначен только для одного пользователя за раз. В многопользовательской системе или многопользовательской * многопользовательской системе у вас будет слишком много данных, чтобы справиться с этим, если вы не создадите специальный постоянный серверный процесс для выполнения этой функции.
Если вам нужна производительность и масштабируемость в этот момент, на самом деле не так сложно развернуть свой собственный постоянный серверный процесс, который использует стандартный протокол, такой как Memcached, и использовать его в качестве своего рода хранилища данных NoSQL.