今回は業務の中で簡易的なページ閲覧数をカウントする機能を作る必要があり、その時に実装した内容を記録として残します。
実装例
今回は簡易的なcolumnテーブルがあると仮定して実装を進めていきます。
| id | title | content | created_at | updated_at |
|-----:|:----------|:----------|:--------------------|:--------------------|
| 1 | Article 1 | Content 1 | 2024-01-01 00:00:00 | 2024-01-10 00:00:00 |
| 2 | Article 2 | Content 2 | 2024-02-15 00:00:00 | 2024-02-20 00:00:00 |
| 3 | Article 3 | Content 3 | 2024-03-10 00:00:00 | 2024-03-15 00:00:00 |
| 4 | Article 4 | Content 4 | 2024-04-20 00:00:00 | 2024-04-25 00:00:00 |
ここへカウントをするカラムを追加します。
#追加コマンド
rails g migration AddViewCountToColumns view_count:integer
=> rails db:migrate
| id | title | content | created_at | updated_at | view_count |
|-----:|:----------|:----------|:--------------------|:--------------------|-------------:|
| 1 | Article 1 | Content 1 | 2024-01-01 00:00:00 | 2024-01-10 00:00:00 | 0 |
| 2 | Article 2 | Content 2 | 2024-02-15 00:00:00 | 2024-02-20 00:00:00 | 0 |
| 3 | Article 3 | Content 3 | 2024-03-10 00:00:00 | 2024-03-15 00:00:00 | 0 |
| 4 | Article 4 | Content 4 | 2024-04-20 00:00:00 | 2024-04-25 00:00:00 | 0 |
最後に閲覧をカウントする処理をカウントしたいページに関連するアクションへ設定をします。
def show
@column = Column.find(params[:id])
# 閲覧数を増やす
+ @column.increment!(:view_count)
end
※increment! メソッドは、RailsのActiveRecordが提供するメソッドの一つで、指定されたカラムの値をインクリメント(増加)させ、その変更をデータベースに即座に保存するためのものです。
これで簡単に閲覧数をカウントする機能をつけることができました。
「人気記事」などを表示する際には、モデル.rbにスコープなどを定義しておくとスムーズに閲覧数が多い記事を取得できるようになると思います!
scope :popular, -> { order(view_count: :desc) }
ただ注意点として、今回の実装ではリロードしても閲覧数が増えていってしまうため、カウントを厳密に行いたい場合には非推奨の方法になります!