日別・月別集計を1行で実現する「groupdate」

こんにちは。tsuka05です。

Railsで「日別の売上推移」や「月別の新規ユーザー数」をグラフ化しようとしたとき、ちょっと面倒なことがあります。 日付フォーマットだとかタイムゾーンだとか、データのない日の扱いとか…

そんな時に便利なのが groupdate です。

導入方法は、Gemfileに追記して bundle install するだけです。

gem 'groupdate'

日別で集計したい場合は group_by_day メソッドを使います。

User.group_by_day(:created_at).count

# 結果(ハッシュで返ってきます)
# {Tue, 1 Jan 2026=>1, Fri, 2 Jan 2026=>2 ... }

もちろん月別、週別などもできます

  • group_by_month(月別)
  • group_by_week(週別)
  • group_by_hour(時間別)
  • group_by_day_of_week(曜日別) などなど

日付のフォーマットもできます。

User.group_by_day(:created_at, format: '%Y-%m-%d').count

# 結果
# {"2026-01-01"=>1, "2026-01-02"=>2 ... }

タイムゾーンは time_zone 引数で指定します。

User.group_by_day(:created_at, time_zone: 'Asia/Tokyo').count

データのない日は0が返されますが、 series 引数で指定できます。

User.group_by_day(:created_at, format: '%Y-%m-%d').count

# 結果
# {"2026-01-01"=>1, "2026-01-02"=>0, "2026-01-03"=>2 ... }
User.group_by_day(:created_at, format: '%Y-%m-%d', series: false).count

# 結果
# {"2026-01-01"=>1, "2026-01-03"=>2 ... }

気になったら、使ってみてはいかがでしょうか。