📖

Rails|ページの閲覧数をカウントし、表示させる方法

2023/08/05に公開

要件

ページの閲覧数をカウントし、投稿一覧、投稿詳細に表示させる
※ 閲覧数は、各投稿へアクセスした数を集計してください

開発環境

ruby 3.1.2p20
Rails 6.1.7.4
Cloud9

前提

Userモデル、Bookモデルを作成・関連付け済み。

モデルとアソシエーション

閲覧数を数えるための ViewCountモデルを作成します。
User と ViewCount、Book と ViewCount は 1対多の関係です。

$ rails g model ViewCount user:references book:references

モデル作成時、user:references のように記述すると、
user_id という外部キーが自動的に作成されます。
また、アソシエーションも一部自動的に作成してくれるので、大変便利です!

$ rails db:migrate
user.rb
has_many :view_counts, dependent: :destroy
book.rb
has_many :view_counts, dependent: :destroy
view_count.rb
  belongs_to :user
  belongs_to :book

Booksコントローラへ記述

今回はBooksコントローラへ記述するので、新しいコントローラは不要です。
(閲覧数は Book/showページと、Book/indexページに追記するため。)

books_controller.rb
def show
    @book = Book.find(params[:id])
    unless ViewCount.find_by(user_id: current_user.id, book_id: @book.id)
      current_user.view_counts.create(book_id: @book.id)
    end
end

「現在ログインしているユーザーが @bookを見た」というデータがない時、
ViewCountデータを作成します。
※1ユーザーが 同じbookを複数回閲覧しても、閲覧数を1にしたいので、このように記述します。

ビューへ記述

必要な箇所に、以下のコードを記述します。

books/show.html.erb
閲覧数 <%= @book.view_counts.count %>

以上で完成です!

参照

https://zenn.dev/goldsaya/articles/d441565fe99356
https://qiita.com/nao0725/items/233b7eeba46fe43a6af3

Discussion