こんにちは。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 ... }
気になったら、使ってみてはいかがでしょうか。