Я пытаюсь найти эффективный способ предоставить данные для построения графика script jqplot количества кликов на определенной модели
У меня есть основная модель: Листинг has_many кликов каждый клик имеет дату как я могу получить количество кликов, созданных за каждый день в диапазоне дат?
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.
def number_of_clicks
start_date = Date.strptime(params[:start_date],"%d/%m/%Y")
end_date = Date.strptime(params[:end_date],"%d/%m/%Y")
options = {conditions = ["date_stamp > ? and date_stamp < ?", start_date, end_date}
Listing.find(:all, options).size
end
find
а затемsize
является неоптимальным, поскольку все данные должны быть переданы в приложение и подсчитаны там, в отличие от подсчета, выполняемого БД с использованием методаcount
.