📚

【Rails】ページ閲覧数の表示

2023/10/10に公開

本の投稿サイトにページの閲覧数を表示させます。

実装要件

  • ページの閲覧数をカウントし、投稿一覧、投稿詳細に表示させる

  • 閲覧数は、各投稿へアクセスした数を集計する

  • 完成イメージ:

今回のポイント

以下記事は登録しているユーザーのみの閲覧数をカウントする方法を分かりやすく解説してくださっています。

https://zenn.dev/goldsaya/articles/d441565fe99356

せっかくなので今回は登録していないユーザーが表示しても閲覧数が増えるようにします。
このサイトは登録者しか入れないサイトですが、ポートフォリオを作るとき等に活かしてもらえたらと思います。

お好きな方を参考にしてくださいね♪

テーブル設計

テーブルは以下の通り。

とっても簡単で、booksテーブルにview_countというカラムを入れてあげるだけです。

カラムの追加

  1. マイグレーションファイル作成
    以下を入力します。
ターミナル
rails g migration AddViewCountToBooks view_count:integer

できたマイグレーションファイルが以下のようになっているか確認ください。

class AddViewCountToBooks < ActiveRecord::Migration[6.1]
  def change
    add_column :books, :view_count, :integer
  end
end
  1. マイグレーションを実行
    以下を入力します。
ターミナル
rails db:migrate

コントローラの追記

以下のコントローラを作成します。

app/controllers/books_controller.rb
:
  def show
    @book = Book.find(params[:id])
    
    # 閲覧数を増やす
+   @book.increment!(:view_count)
:
  end

解説:
increment!は、Active Recordのメソッドで、指定したカラム(ここではview_count)の値を1増やす操作を行います。このコードが実行されることで、本を閲覧する度に閲覧数が増えます。

Active Recordについては以下も参照くださいね。
https://zenn.dev/ganmo3/articles/3d2a724e9e49ef

ビューの記述

必要箇所に以下を入れてあげます。

閲覧数: <%= @book.view_count %>

他の方法

gem:impressionistを入れても簡単にできます。
https://zenn.dev/ganmo3/articles/935496795fd6d2

@book.increment!(:view_count) vs impressionist

それぞれの違いは以下の通りです。

特性 @book.increment!(:view_count) impressionist gem
データベースへのアクセス 直接データベースを更新 リクエストごとに情報をログへ記録
パフォーマンス 高負荷時にデータベース負荷が増加 データベース負荷を削減
閲覧数のカウント 基本的なカウントのみ より高度なカウントと情報収集
ブラウザやデバイス情報の記録 いいえ はい
IPアドレスの記録 いいえ はい
期間別の統計情報 いいえ はい
高度な分析とカスタマイズ 限定的 サポートされている
簡易性 簡単 gemの設定とカスタマイズが必要

これはアプリケーションに応じてどちらにするか決めてくださいね。
gemの実装も難しくはありません。

俺はポートフォリオで閲覧数の実装をしましたが、以下の理由でgemを使いました。

  • 期間別(週間ごとの閲覧数の把握等)をしたかった
  • 一定の時間でユーザーが同じ記事を何度も閲覧しても、1回のカウントとしたい

何かありましたら気軽にコメントいただけたら嬉しいです♪

Discussion