7
4

More than 3 years have passed since last update.

Rails Datetime型のカラムの値を日付(mm/dd/yyyy)単位で集計する方法

Posted at

はじめに

gem chatkickを使用して、値を日付(mm/dd/yyyy)ごとにカウントしようとした際に、ハマってしまったのでその備忘録になります。

概要

やりたかったことは簡単グラフ表示 gem 'charkick'を使用して、テーブルの値を日付単位でカウントして表示したかった。
ちなみに、charkick の一次情報はこちら。
また、charkickを使っての日付単位での集計にはgem 'groupdate'を使うことがベストプラクティスらしい

導入

以下の記事を参考にcharkickを導入しました
Railsメモ(29) : Chartkickで簡単にグラフを描画する

ここから本題

ぶつかった問題

エラー発生
ActiveRecord::Base.default_timezone must be :utc to use Groupdate
スクリーンショット 2020-01-10 11 57 39

どうやらtimezoneがUTCでないといけないらしい。アプリのtimezoneをtokyoにしていたが、あくまでtokyoのままカウントしたい。

application.rb

  class Application < Rails::Application
   ## 途中略
   config.time_zone = 'Tokyo'
  end

対応策

groupdateのメソッドgroup_by_day を使うとエラーの回避ができず、しょうがなくあきらめることに。
ちなみにエラーが出ていたコードは以下。

  • 対応前
user_controller.rb

  class UsersController < ApplicationController
   ## 途中略
    def show

      @data2 = Message.where(user_id: current_user.id).group_by_day(:created_at).count
      ## 途中略
     end
  end
  • 対応後
user_controller.rb

  class UsersController < ApplicationController
   ## 途中略
    def show
     # messageテーブル値の取得
     data2 = Message.where(user_id: current_user.id)

     # 配列の宣言
     c = []

     # data2の値を日付(mm/dd/yyyy)形式で取得し配列に格納
     data2.each do |d|
       c << d.created_at.strftime('%Y%m%d').to_s
     end

     # 配列に含まれている重複している値を数える
     @data2 = c.each_with_object(Hash.new(0)){|v,o| o[v]+=1}

     @today = Date.today
     @lastmonth_today = @today.prev_day(14)
    end
  end

もっといい書き方ができるかもしれませんが、とりあえずこれで日付単位でのカウントができた。

ちなみに表示側のHTML以下

show.html.haml.rb
.learning-curve
  # 途中略
  .learning-curve_graph
  = line_chart @data2, width: "100%", height: "300px",min: 0, max: 20, xmin: @lastmonth_today, xmax: @today,label: "Value",xtitle: "日付",ytitle: "登録件数"

結果

無事に日付単位でのカウントに成功し、グラフの表示ができた。

スクリーンショット 2020-01-10 12 53 15

7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4