2013-11-19 5 views
4

В Rails/Ruby, как мне группировать и суммировать меру по месяцам, исходя из столбца даты в таблице.Rails 4: по месяцам

Я пробовал следующую технику от Railscasts.

http://railscasts.com/episodes/29-group-by-month

До сих пор, мой код выглядеть следующим образом

result = result.where(transaction_date: start..Date.current) 
result = result.select(:transaction_date, :quantity) 
result.group_by { |t| t.transaction_date.beginning_of_month } 

Я думаю, мне нужно Рубиновый эквивалент SQL GROUP BY для Rollup количество.

версия SQLite3, что я ищу это:

select strftime('%m', transaction_date) 
    , sum(quantity) 
from transactions 
group by strftime('%m', transaction_date) 
+0

Отъезд раздел * 6 Группа * по адресу http://guides.rubyonrails.org/active_record_querying.html#sum –

+0

SQLite3 и PG. Я думаю, что я должен использовать SQL напрямую. –

ответ

4

Так что это хороший пример того, почему вы должны использовать ту же базу данных разработчика и прод, потому что вы действительно хотите сделать это в SQL которые будут отличаться для двух указанных вами баз данных. Я дам вам версию Postgres.

Если предположить, что модель называется «Entity», и вы суммирование атрибута называется количеством, вы будете хотеть сделать что-то вроде этого:

Entity.select("date_trunc('month', created_at) as month, sum(quantity) as total_quantity").group('month') 

Полученных объектов Entity будет иметь виртуальные атрибуты ' month 'и' total_quantity ', которые вы можете использовать для своих отчетов.

+1

Наличие двух баз данных было причиной моего опасения сначала пойти по пути SQL. И, я считаю, легче подталкивать такую ​​обработку к базе данных как с точки зрения обработки, так и с точки зрения технического обслуживания. –

+1

Любая идея, как это сделать в группе? '' 'Entity.select (" date_trunc ('month', created_at) как месяц "). Group ('month'). Count''' вызывает ошибку. Он также теряет функцию функции 'date_trunc' и заменяет запрос:' '' SELECT COUNT (*) AS count_all, месяц AS month FROM "entity" GROUP BY month'''. Это, очевидно, повышает значение '' 'ERROR: столбец« месяц »не существует''', поскольку столбец * месяц * является виртуальным. – rhetonik

+2

Понял это. '.count' не будет работать, но' .select ("COUNT (*) AS count, date_trunc (...' добавит виртуальный атрибут 'count' для каждого сгруппированного значения в возвращаемом массиве, что даже сохранит Arel создает до и после '.select [...]. group'. – rhetonik

Смежные вопросы