Rails|投稿数の前日比 / 先週比を表示する
要件
・ユーザ詳細ページに、今日の投稿数を表示させる
・ユーザ詳細ページに、前日の投稿数を表示させる
・ユーザ詳細ページに、前日と今日の投稿数の差を表示させる
・ユーザ詳細ページに、今週の投稿数の合計を表示させる
・ユーザ詳細ページに、先週の投稿数の合計を表示させる
・ユーザ詳細ページに、今週と先週の投稿数の差を表示させる(先週と比べる)
開発環境
ruby 3.1.2p20
Rails 6.1.7.4
Cloud9
前提
Userモデル、Bookモデルは作成済み
Bootstrapを導入済み
Bookモデルに記述
今日、前日、今週、先週の投稿数を数えるための準備をします。
ここでは、scopeを作成しています。メソッドの簡易版みたいなイメージです。
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コントローラに記述します。
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 に記述
<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の時は、「前日/前週の投稿はなし」と表示させる。
これで完成です!
参照
Discussion