🌬️

Rails 投稿数の前日比/前週比を表示

2023/04/29に公開

投稿数の前日比・前週比を表示させる

  • 今日・前日の投稿数を表示
  • 前日と今日の投稿数の差を表示(今日の数値 / その前日の数値)
  • 今週・先週の投稿数の合計を表示
  • 今週と先週の投稿数の差を表示(先週と比べる)

モデル

本の投稿数を数えるので、book.rbに記述してく。

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 :スコープの名前, -> { 条件式 }

モデル側であらかじめ特定の条件式に対して名前をつけて定義し、
その名前でメソッドの様に条件式を呼び出すことが出来る仕組みのこと!!

https://pikawaka.com/rails/scope

コントローラー

user/showページに載せたいので、users_controllerのに記述!

users_controller

def show
  @books = @user.books.page(params[:page]).reverse_order
  @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

⚠️モデルで定めたスコープの名前をここで使用している!

ビュー

bootstrapを使用しているのでtableタグを使用!

users/show.html.erb

<h3>投稿数の前日比・前週比</h3>
  <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>前日の投稿はなし</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>先週の投稿はなし</td>
        <% else %>
	  <td><% @the_week_before = @this_week_book.count / @last_week_book.count  %>
	  <%= (@the_week_before * 100).round %>%</td>
        <% end %>
        </tr>
      </tbody>
    </table>

if文を使い、条件分岐し前日比 = 昨日の投稿数÷前日の投稿数を定義。

@the_week_before = @this_week_book.count / @last_week_book.count
前週に比べて今週の投稿数が何倍かを計算
このままだと整数で表示されるため、小数点以下は切り捨てられる。

@the_week_before = @this_week_book.count / @last_week_book.count.to_f
このようにto_fを入れると、小数点の数値まで表示できる!

参照
https://qiita.com/nao0725/items/409ece34ecbec5167125
https://qiita.com/ki_87/items/cbfdb803355ba4e4fe55

Discussion