Несмотря на то, что вы можете сделать это с помощью простой операции GROUP BY
и получить нужные записи, вы можете обнаружить, что это не особенно эффективно, так как для этого потребуется сортировка на стороне сервера и ее нельзя проиндексировать:
SELECT DATE(created_at) AS on_date, COUNT(id) AS count_for_date FROM practices GROUP BY DATE(created_at)
Это вернет количество записей, проиндексированных по дням. Нулевых записей не будет, так как они не будут сгруппированы, но, как вы заметили, вы всегда можете вычислить, сколько пропущенных дней существует, исходя из того, сколько их должно быть.
Вы можете перебрать эти результаты, используя объект подключения:
Practice.connection.select_rows("...").each do |date, count|
# ...
end
Чтобы оптимизировать это, просто добавьте столбец с индексированной датой в вашу схему:
add_column :practices, :created_on, :date
execute "UPDATE practices SET created_on=created_at"
add_index :practices, :created_on
При сохранении моделей обязательно укажите это поле:
class Practice < ActiveRecord::Base
before_create :assign_created_on
protected
def assign_created_on
self.created_on = Date.today
end
end
Это должно сделать ваш запрос полностью индексируемым и намного быстрее.