Вам необходимо правильно проиндексировать данные, иначе это не будет эффективно работать.Если вы используете гранулярность "день", то стоит иметь столбец Дата.Затем вы можете использовать стандартную операцию SQL GROUP BY для непосредственного получения нужных значений.
Например, миграция может быть выполнена следующим образом:
self.up
add_column :posts, :created_on_date
add_index :posts, :created_on_date
execute "UPDATE posts SET created_on_date=created_at"
end
Тогда поиск действительно быстрый, так как онможете использовать индекс:
def sparkline_data
self.class.connection.select_values("
SELECT created_on_date, COUNT(id) FROM posts
WHERE created_on_date>DATE_SUB(UTC_TIMESTAMP(), INTERVAL 14 DAY)
GROUP BY created_on_date
").collect(&:to_i)
end
Имейте в виду, что если вы потенциально пропускаете день, вам придется учесть это, вставив нулевое значение в свои результаты.Дата здесь возвращается, поэтому вы должны быть в состоянии вычислить пропущенные значения и заполнить их. Как правило, это делается путем итерации по группе дней с помощью метода collect.
Когда вам нужно получить тонкий фрагментданные быстро, загрузка экземпляров моделей всегда будет огромным узким местом.Часто вам нужно перейти непосредственно к SQL, если нет простого способа получить то, что вам нужно.