📚
【Rails】ページ閲覧数の表示
本の投稿サイトにページの閲覧数を表示させます。
実装要件
-
ページの閲覧数をカウントし、投稿一覧、投稿詳細に表示させる
-
閲覧数は、各投稿へアクセスした数を集計する
-
完成イメージ:
今回のポイント
以下記事は登録しているユーザーのみの閲覧数をカウントする方法を分かりやすく解説してくださっています。
せっかくなので今回は登録していないユーザーが表示しても閲覧数が増えるようにします。
このサイトは登録者しか入れないサイトですが、ポートフォリオを作るとき等に活かしてもらえたらと思います。
お好きな方を参考にしてくださいね♪
テーブル設計
テーブルは以下の通り。
とっても簡単で、booksテーブルにview_count
というカラムを入れてあげるだけです。
カラムの追加
- マイグレーションファイル作成
以下を入力します。
ターミナル
rails g migration AddViewCountToBooks view_count:integer
できたマイグレーションファイルが以下のようになっているか確認ください。
class AddViewCountToBooks < ActiveRecord::Migration[6.1]
def change
add_column :books, :view_count, :integer
end
end
- マイグレーションを実行
以下を入力します。
ターミナル
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については以下も参照くださいね。
ビューの記述
必要箇所に以下を入れてあげます。
閲覧数: <%= @book.view_count %>
他の方法
gem:impressionistを入れても簡単にできます。
@book.increment!(:view_count) vs impressionist
それぞれの違いは以下の通りです。
特性 | @book.increment!(:view_count) | impressionist gem |
---|---|---|
データベースへのアクセス | 直接データベースを更新 | リクエストごとに情報をログへ記録 |
パフォーマンス | 高負荷時にデータベース負荷が増加 | データベース負荷を削減 |
閲覧数のカウント | 基本的なカウントのみ | より高度なカウントと情報収集 |
ブラウザやデバイス情報の記録 | いいえ | はい |
IPアドレスの記録 | いいえ | はい |
期間別の統計情報 | いいえ | はい |
高度な分析とカスタマイズ | 限定的 | サポートされている |
簡易性 | 簡単 | gemの設定とカスタマイズが必要 |
これはアプリケーションに応じてどちらにするか決めてくださいね。
gemの実装も難しくはありません。
俺はポートフォリオで閲覧数の実装をしましたが、以下の理由でgemを使いました。
- 期間別(週間ごとの閲覧数の把握等)をしたかった
- 一定の時間でユーザーが同じ記事を何度も閲覧しても、1回のカウントとしたい
何かありましたら気軽にコメントいただけたら嬉しいです♪
Discussion