🍎
【Rails】投稿数の前日比・前週比 表示方法
はじめに
読んだ本のタイトルと感想を投稿することができるサイトを作成しています。
読書量を記録するべく、どのくらいの頻度で本を読んでいるか把握できるように投稿数や頻度を表示させる機能を実装します!
- 今日の投稿数、前日の投稿数を表示
- 今日と前日の投稿数の差を表示
- 今週と先週の投稿数の合計を表示
- 今週と先週の投稿数の差を表示
- 「Bookモデル」作成済
- Bootstrap導入済
- 完成イメージ ↓
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
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>
- 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 %>%
- 先週比 = 今週の投稿数 ÷ 先週の投稿数
以上で投稿数、前日比と先週比を表示させることができました!
こちらのサイトを参考にさせていただきました🙏
Discussion