Rails Datetime 형식의 열 값을 날짜(mm/dd/yyyy) 단위로 집계하는 방법

소개



gem chatkick을 사용해, 값을 일자(mm/dd/yyyy)마다 카운트하려고 했을 때에, 빠져 버렸으므로 그 비망록이 됩니다.

개요



하고 싶었던 것은 간단 그래프 표시 gem 'charkick'을 사용해, 테이블의 값을 일자 단위로 카운트해 표시하고 싶었다.
그건 그렇고, charkick의 1 차 정보는 여기.
또한 charkick을 사용하여 날짜 단위로 집계하려면 gem 'groupdate'을 사용하는 것이 가장 좋은 방법입니다.

소개



아래의 기사를 참고로 charkick을 도입했습니다
Rails 메모(29) : Chartkick에서 쉽게 그래프를 그리기

여기에서 본제



부딪힌 문제

오류 발생
ActiveRecord::Base.default_timezone must be :utc to use Groupdate


아무래도 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: "登録件数"
    

    결과



    무사히 일자 단위로의 카운트에 성공해, 그래프의 표시가 생겼다.

    좋은 웹페이지 즐겨찾기