2014-12-20 2 views
0

Теперь я столкнулся с проблемой, которая я хочу написать заявление, чтобы вернуть ежемесячный счет,Рубин на Rails: Как получить ежемесячный счет с помощью PG

Например, в период 2014-01 до 2014 года -12. возвращает массив заказа как

["Jan, 5", "Feb, 0",...,"Dec, 55" ] 

Возможное решение, которое я только знаю, является

1. get a scope to return monthly record 
2. calculate the period number, like here is 12 
3. repeat 12.times to get record size for each month 
4. build array 

Проблема в том, что я должен повторять запросы в 12 раз! Это так странно. Я знаю, что group_by может быть лучшим выбором, но не знаю, как достичь производительности, которой я действительно хочу быть. Может ли кто-нибудь мне помочь?

ответ

1

Отформатируйте столбец даты с помощью Postgres's to_char, а затем используйте его в групповом методе ActiveRecord.

start = Date.new(2014, 1, 1) 
finish = Date.new(2014, 12, 31) 

range = start..finish 

return_hash = ModelClass. 
       where(created_at: range). 
       group("to_char(created_at, 'Mon YYYY')"). 
       count 

Это возвращает хэш как {"Nov 2014" => 500}

К «заполнить пробелы» вы можете создать month_names массив и сделать:

month_names.each{ |month| return_hash[month] ||= 0 } 

Рассмотрим создание новой хэш вообще, что имеет ключи отсортированы в соответствии с вашей переменной month_names.

Затем получить желаемый результат:

return_hash.map{ |month, count| "#{month}, #{count}" } 
+0

, если нет какой-либо записи в течение месяца, как , ['Jun', 55, 'July, 0', 'Aug, 50']. Я не знаю, как вставить 0 в массив, а месячные записи - 0. – Perpherior