Ответ 1
В этом случае лучшим решением для меня было либо сделать это в прямом SQL, либо использовать функцию activerecord group_by:
@user.all.group_by{ |u| u.created_at.beginning_of_month }
Я делаю некоторые статистические вычисления в своем продукте. Пользователь выполнил ряд операций, допустим, опубликовал комментарии. Я хочу показать им, сколько комментариев они отправили в неделю за последний месяц или месяц за последний год.
Есть ли способ с activerecord, чтобы группироваться таким образом? Лучше всего просто сделать это вручную - перебирать суммирование записей на основе моих собственных критериев?
class User < ActiveRecord::Base
has_many :comments
end
class Comments < ActiveRecord::Base
belongs_to :user
end
@user.comments(:all).map {|c| ...do my calculations here...}
или есть лучший способ?
спасибо! Орен
В этом случае лучшим решением для меня было либо сделать это в прямом SQL, либо использовать функцию activerecord group_by:
@user.all.group_by{ |u| u.created_at.beginning_of_month }
В Postgres вы можете:
@user.comments.group("DATE_TRUNC('month', created_at)").count
чтобы получить:
{"2012-08-01 00:00:00"=>152, "2012-07-01 00:00:00"=>57, "2012-09-01 00:00:00"=>132}
Он принимает значения от "микросекунд" до "тысячелетия" для группировки: http://www.postgresql.org/docs/8.1/static/functions-datetime.html#FUNCTIONS-DATETIME-TRUNC
Вот более утонченная версия этого
@user.comments.group("year(created_at)").group("month(created_at)").count
Мое предположение будет примерно таким:
@user.comments.count(:group => "year(created_at),month(created_at)")
Сухой код, ymmv
Используйте group_by
@user.comments.group_by(&:week)
class User < ActiveRecord::Base
def week
some_attribute_like_date.strftime('%Y-%W')
end
end
Это даст вам сгруппированный список в формате YYYY-WW
Проверьте плагин has_activity.
Отметьте графу даты группы
https://github.com/ankane/groupdate
он имеет последние коммиты, работает с postgresql, легко интегрируется с ударом диаграммы для быстрого построения диаграмм и работает с часовыми поясами!