😺

Rails|投稿数の前日比 / 先週比を表示する

2023/08/05に公開

要件

・ユーザ詳細ページに、今日の投稿数を表示させる
・ユーザ詳細ページに、前日の投稿数を表示させる
・ユーザ詳細ページに、前日と今日の投稿数の差を表示させる
・ユーザ詳細ページに、今週の投稿数の合計を表示させる
・ユーザ詳細ページに、先週の投稿数の合計を表示させる
・ユーザ詳細ページに、今週と先週の投稿数の差を表示させる(先週と比べる)

開発環境

ruby 3.1.2p20
Rails 6.1.7.4
Cloud9

前提

Userモデル、Bookモデルは作成済み
Bootstrapを導入済み

Bookモデルに記述

今日、前日、今週、先週の投稿数を数えるための準備をします。
ここでは、scopeを作成しています。メソッドの簡易版みたいなイメージです。

https://pikawaka.com/rails/scope

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) }

スコープは以下のような形で記述します。

scope :スコープの名前, -> { 条件式 }

使い方としては、books.created_todayのように、メソッドと同じ使い方ができます。

scope :created_today, -> { where(created_at: Time.zone.now.all_day) }
今日1日で作成した 全Bookを取得します。

scope :created_yesterday, -> { where(created_at: 1.day.ago.all_day) }
昨日1日で作成した 全Bookを取得します。

scope :created_this_week, -> { where(created_at: 6.day.ago.beginning_of_day..Time.zone.now.end_of_day) }
6日前の0:00から今日の23:59までに作成した 全Bookを取得します。

scope :created_last_week, -> { where(created_at: 2.week.ago.beginning_of_day..1.week.ago.end_of_day) }
2週間前の0:00から1週間前の23:59までに作成した 全Bookを取得します。

Usersコントローラに記述

user/showページに表示したいので、Usersコントローラに記述します。

users_controller.rb
  def show
    @user = User.find(params[:id])
    @books = @user.books
    @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

Bookモデルで作成した scopeを利用して、それぞれのデータをわかりやすい名前に代入します。

users/show に記述

users/show.html.erb
      <h2>投稿数の前日比・先週比</h2>
      <table class="table">
        <tr>
          <th>今日の投稿数</th>
          <th>前日の投稿数</th>
          <th>前日比</th>
        </tr>
        <tr>
          <td><%= @today_book.count %></td>
          <td><%= @yesterday_book.count %></td>
          <% if @yesterday_book.count == 0 %>
            <td>前日の投稿はなし</td>
          <% else %>
            <td>
              <% @the_day_before =  @today_book.count / @yesterday_book.count  %>
              <%= (@the_day_before * 100).round %>
            </td>
          <% end %>
        </tr>
      </table>

      <table class="table">
        <tr>
          <th>今週の投稿数</th>
          <th>前週の投稿数</th>
          <th>前週比</th>
        </tr>
        <tr>
          <td><%= @this_week_book.count %></td>
          <td><%= @last_week_book.count %></td>
          <% if @last_week_book.count == 0 %>
            <td>前週の投稿はなし</td>
          <% else %>
              <% @the_week_before =  @this_week_book.count / @last_week_book.count  %>
              <%= (@the_week_before * 100).round %>
          <% end %>
        </tr>
      </table>

前日比の計算方法は
( 当日の投稿数 / 前日の投稿数 ) * 100 で算出できる。

.round で四捨五入します。

0で割り算をするとErrorが発生してしまうので、
前日/前週の投稿数が0の時は、「前日/前週の投稿はなし」と表示させる。

これで完成です!

参照

https://zenn.dev/goldsaya/articles/04ba5c23d27531
https://qiita.com/nao0725/items/b604f1351f2210330c82

Discussion