date_from = Date.parse '2010-06-01'
date_to = Date.parse '2010-07-01'
click_counts = (date_from..date_to).map{|date|
[date, Click.count(:conditions => {:date_stamp => date})]
}
вернет массив пар [date, count]
за указанный период.Однако при этом будет выполняться запрос к базе данных для каждого дня в диапазоне дат.
Одним из распространенных решений для решения таких запросов является создание таблицы базы данных, заполненной всеми датами (скажем, за предыдущие и следующие 10 лет с этого момента).), а затем выполните JOIN
, аналогично:
SELECT d.date, COUNT(c.date_stamp)
FROM dates d
LEFT JOIN clicks c ON d.date = c.date_stamp
GROUP BY d.date
, который вернет все количество кликов в одном запросе.
Или, в качестве третьего решения, вы можете получитьколичество кликов для существующих дат:
Click.find(:all,
:select => "date_stamp, count(*) as count",
:group => 'date_stamp',
:conditions => ["date_stamp >= ? and date_stamp < ?", date_from, date_to])
и добавление «пустых» дней в Ruby.