🍧

Rails chart.jsでグラフ表示

2023/04/29に公開

過去7日間分それぞれの投稿数を一覧表示

💡この流れと同じように実装!
https://zenn.dev/goldsaya/articles/04ba5c23d27531

モデル

model/book.rb
scope :created_today, -> { where(created_at: Time.zone.now.all_day) } # 今日
scope :created_yesterday, -> { where(created_at: 1.day.ago.all_day) } # 前日
scope :created_2day_ago, -> { where(created_at: 2.day.ago.all_day) } # 2日前
scope :created_3day_ago, -> { where(created_at: 3.day.ago.all_day) } # 3日前
scope :created_4day_ago, -> { where(created_at: 4.day.ago.all_day) } # 4日前
scope :created_5day_ago, -> { where(created_at: 5.day.ago.all_day) } # 5日前
scope :created_6day_ago, -> { where(created_at: 6.day.ago.all_day) } # 6日前

コントローラー

users_controller
def show
    @user = User.find(params[:id])
    @books = @user.books
    @book = Book.new
    @today_book =  @books.created_today
    @yesterday_book = @books.created_yesterday
    @this_week_book = @books.created_this_week
    @last_week_book = @books.created_last_week
  end

ビュー

users/show.html.erb
<h4>7日間分の投稿数</h4>
  <table class='table table-bordered'>
    <thead>
      <tr> 
        <th>6日前</th>
        <th>5日前</th>
        <th>4日前</th>
        <th>3日前</th>
        <th>2日前</th>
        <th>1日前</th>
        <th>今日</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td><%= @books.created_6day_ago.count %></td>
        <td><%= @books.created_5day_ago.count %></td>
        <td><%= @books.created_4day_ago.count %></td>
        <td><%= @books.created_3day_ago.count %></td>
        <td><%= @books.created_2day_ago.count %></td>
        <td><%= @books.created_yesterday.count %></td>
        <td><%= @books.created_today.count %></td>
      </tr>
    </tbody>

🏋🏻もっとコンパクトなコードにリファクタリングも可能だそう!
https://qiita.com/ki_87/items/d22238d14b298ef22a85


chart.jsを使って、過去7日分の投稿数グラフ化

Chart.jsをインストール!

Chart.jsとは

  • JavaScript でグラフ(チャート)を描画するためのライブラリ

Chart.jsを使用するために、npmもしくはCDNからライブラリを読み込む。

  1. npmの場合
npm install chart.js
  1. CDNを使って使用する場合

このリンクが必要

<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>

Turbolinksの無効化

無効化にしないと、ログイン後にUserページが表示された際に
グラフが反映されなかったのでしっかり無効化する。

この部分でTurbolinksを個別で無効化
$(document).on('turbolinks:load', function() {

turbolinksについてわかりやすい記事

https://qiita.com/ginger-yell/items/740818f484bfbc1edb4d#jsの表示を邪魔するのは

ビュー

<canvas id="myLineChart"></canvas>
  <script>
    $(document).on('turbolinks:load', function() {
      var ctx = document.getElementById("myLineChart");
      var myLineChart = new Chart(ctx, {
        type: 'line',
        data: {
          labels: ['6日前', '5日前', '4日前', '3日前', '2日前', '1日前', '今日'],
          datasets: [
            {
              label: '投稿した本の数',
              data: [
                <%= @books.created_6day_ago.count %>,
                <%= @books.created_5day_ago.count %>, 
                <%= @books.created_4day_ago.count %>, 
                <%= @books.created_3day_ago.count %>, 
                <%= @books.created_2day_ago.count %>, 
                <%= @books.created_yesterday.count %>, 
                <%= @books.created_today.count %>
              ],
              borderColor: "rgba(0,0,255,1)",
              backgroundColor: "rgba(0,0,0,0)",
              tension: 0.4
            }
          ],
        },
        options: {
          title: {
            display: true,
            text: '7日間の投稿数の比較'
          },
          responsive: true,
          scales: {
            y:{
              suggestedMin: 0,
              suggestedMax: 10
            },
            x:{
              stacked: true
            },
          },
        }
      });
    });
  </script>

グラフ描画エリア設定

公式の通り記載

<canvas id="myChart"></canvas>

canvas要素取得

先ほど設定した、canvas要素(ID : myChart ) を取得し、変数 ctx に入力
(4行目)

var ctx = document.getElementById("myLineChart");

ちなみにctxとは "canvas context" の略で、canvas要素の描画コンテキストを指している。

Chart設定

描画するグラフを、「new Chart( )」によって設定する。
(5行目)

var myLineChart = new Chart(ctx, {
        type: タイプ,
        data: データ,
	options: オプション
	}

グラフを表示するためには「type」「data」「options」の3項目を設定する必要がある。

🌱参考にさせていただいた記事

https://qiita.com/SAPPOROBEER/items/989bb97742b9851e7f71
https://qiita.com/ki_87/items/37e9f42c118f87416aa6

複数のグラフを描画することも可能!
https://memorva.jp/memo/html/chartjs_line_chart.php
ドキュメント
https://www.chartjs.org/docs/latest/
日本語ver
https://tr.you84815.space/chartjs/general/responsive.html

typeの種類でいろいろなグラフを指定できる!

設定項目 グラフ
bar 棒グラフ
line 折れ線グラフ
pie 円グラフ
radar レーダーチャート
bubble バブルチャート
scatter 散布図

最初は同じようなお手本があまり見つからず、どう曲線のグラフを作るか少し困ったが
他のグラフのフォーマットのオプションを変えていってなんとか完成!

Discussion