はじめに
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
どうやらtimezoneがUTCでないといけないらしい。アプリのtimezoneをtokyoにしていたが、あくまでtokyoのままカウントしたい。
class Application < Rails::Application
## 途中略
config.time_zone = 'Tokyo'
end
対応策
groupdateのメソッドgroup_by_day を使うとエラーの回避ができず、しょうがなくあきらめることに。
ちなみにエラーが出ていたコードは以下。
- 対応前
class UsersController < ApplicationController
## 途中略
def show
@data2 = Message.where(user_id: current_user.id).group_by_day(:created_at).count
## 途中略
end
end
- 対応後
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以下
.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: "登録件数"
結果
無事に日付単位でのカウントに成功し、グラフの表示ができた。
