🍎

【Rails】投稿数の前日比・前週比 表示方法

2023/08/20に公開

はじめに

読んだ本のタイトルと感想を投稿することができるサイトを作成しています。
読書量を記録するべく、どのくらいの頻度で本を読んでいるか把握できるように投稿数や頻度を表示させる機能を実装します!

  • 今日の投稿数、前日の投稿数を表示
  • 今日と前日の投稿数の差を表示
  • 今週と先週の投稿数の合計を表示
  • 今週と先週の投稿数の差を表示
  • 「Bookモデル」作成済
  • Bootstrap導入済
  • 完成イメージ ↓
    altテキスト

1.Bookモデルに記述

本の投稿数を表示させるため、Bookモデルに記述

app/models/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_this_week, -> { where(created_at: 6.day.ago.beginning_of_day..Time.zone.now.end_of_day) }
scope :created_last_week, -> { where(created_at: 2.week.ago.beginning_of_day..1.week.ago.end_of_day) }
  • 「Time.zone.now.all_day」1日
  • 「1.day.ago」昨日
  • 「6.day.ago.beginning_of_day..Time.zone.now.end_of_day」今週(6日前の00:00:00から今日の23:59:59まで
  • 「2.week.ago.beginning_of_day..1.week.ago.end_of_day」先週(2週間前の始まりから1週間前の終わりまで)
  • 「scope」とは・・・モデル側で特定の条件式に対して名前をつけて定義することで、メソッドと同じように条件式を呼び出すことができる
scope基本構文
class モデル名 < ApplicationRecord
  scope :スコーブ名, -> { 条件式 }
end

https://pikawaka.com/rails/scope

2.コントローラーに記述

users/showページに表示させるため、usersコントローラーに追記する

app/controllers/users_controller.rb
class UsersController < ApplicationController
  before_action :is_matching_login_user, only: [:edit, :update]

  def show
:
    @books = @user.books
    @today_book = @books.created_yesterday
    @yesterday_book = @books.created_yesterday
    @this_week_book = @books.created_this_week
    @last_week_book = @books.created_last_week
  end
:
end

先ほどモデルで定義したスコープをコントローラーで使っている

3.ビュー作成

bootstrapを導入しているためtableタグを使用してビューを作成する

app/views/users/show.html.erb
<h4>投稿数の前日比/前週比</h4>
  <div class="table_width">
    <table class="table table-bordered">
      <thead>
        <tr>
          <th>今日の投稿</th>
          <th>前日の投稿</th>
          <th>前日比</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td><%= @today_book.count %></td>
          <td><%= @yesterday_book.count %></td>
        <% if @yesterday_book.count == 0 %>
          <td>前日の投稿は0件</td>
        <% else %>
          <td><% @the_day_before = @today_book.count / @yesterday_book.count %>
          <%= (@the_day_before * 100).round %>%</td>
        <% end %>
        </tr>
      </tbody>
    </table>

    <table class="table table-bordered">
      <thead>
        <tr>
          <th>今週の投稿</th>
          <th>先週の投稿</th>
          <th>先週比</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td><%= @this_week_book.count %></td>
          <td><%= @last_week_book.count %></td>
        <% if @last_week_book.count == 0 %>
          <td>先週の投稿は0件</td>
        <% else %>
          <td><% @the_week_before = @this_week_book.count / @last_week_book.count %>
          <%= (@the_week_before * 100).round %>%</td>
        <% end %>
        </tr>
      </tbody>
    </table>
  </div>

altテキスト

  • if文で条件分岐させ、投稿がある場合とない場合で表示内容を用意
  • <% @the_day_before = @today_book.count / @yesterday_book.count %><%= (@the_day_before * 100).round %>%
    • 前日比 = 今日の投稿数 ÷ 前日の投稿数
  • <% @the_week_before = @this_week_book.count / @last_week_book.count %><%= (@the_week_before * 100).round %>%
    • 先週比 = 今週の投稿数 ÷ 先週の投稿数

以上で投稿数、前日比と先週比を表示させることができました!

こちらのサイトを参考にさせていただきました🙏

https://zenn.dev/goldsaya/articles/04ba5c23d27531

https://qiita.com/nao0725/items/409ece34ecbec5167125

Discussion