[Rails] 閲覧数を計測するライブラリ


はじめに

自作のアプリケーションで記事を投稿する機能をつける時に閲覧数を表示させたかったので、以下を参考にimpressionistというGemを使い実装しました。

環境

ruby 2.6.6
rails 6.0.3

やり方

1.impressionistのインストール

Gemfile
gem 'impressionnist'

上記の記述をしてbundle installをしましょう。

2.impressionnists_tableの作成

以下のコマンドを入力するとimpressionistが定義した、impressionsテーブルをしようすることができます。

rails g impressionist

rails db:migrateを実行します。

rails db:migrate

すると以下のようなmigrationファイルが作成されました。

class CreateImpressionsTable < ActiveRecord::Migration[6.0]
  def self.up
    create_table :impressions, :force => true do |t|
      t.string :impressionable_type
      t.integer :impressionable_id
      t.integer :user_id
      t.string :controller_name
      t.string :action_name
      t.string :view_name
      t.string :request_hash
      t.string :ip_address
      t.string :session_hash
      t.text :message
      t.text :referrer
      t.text :params
      t.timestamps
    end
    add_index :impressions, [:impressionable_type, :message, :impressionable_id], :name => "impressionable_type_message_index", :unique => false, :length => {:message => 255 }
    add_index :impressions, [:impressionable_type, :impressionable_id, :request_hash], :name => "poly_request_index", :unique => false
    add_index :impressions, [:impressionable_type, :impressionable_id, :ip_address], :name => "poly_ip_index", :unique => false
    add_index :impressions, [:impressionable_type, :impressionable_id, :session_hash], :name => "poly_session_index", :unique => false
    add_index :impressions, [:controller_name,:action_name,:request_hash], :name => "controlleraction_request_index", :unique => false
    add_index :impressions, [:controller_name,:action_name,:ip_address], :name => "controlleraction_ip_index", :unique => false
    add_index :impressions, [:controller_name,:action_name,:session_hash], :name => "controlleraction_session_index", :unique => false
    add_index :impressions, [:impressionable_type, :impressionable_id, :params], :name => "poly_params_request_index", :unique => false, :length => {:params => 255 }
    add_index :impressions, :user_id
  end

  def self.down
    drop_table :impressions
  end
end

閲覧数を計測したいモデルとコントローラーに記述を追加する。

今回は記事を投稿できるアプリケーションを想定してPostテーブルを使用してimpressionist用の記述をしていきます。

posts_controller.rb
class QuestionsController < ApplicationController
  impressionist :actions=> [:show]
  def show
   @post = Post.find(params[:id])
   impressionist(@post, nil, unique: [:session_hash])
  end
end

上記のimpressionistををみると第1引数に閲覧する記事のインスタンス、第2引数にオプション(今回は指定なし)、第3引数のunique: [:session_hash]は同じ人がアクセスした場合と複数回同じ記事をみた場合は1回分のアクセスという設定をしています。

最後に計測したいモデルに以下を追加します。

post.rb
class Post < ApplicationRecord
  is_impressionable
end

ブラウザで閲覧数を確認する場合以下の記述をします。

show.html.erb
<%=  @post.impressionist_count %>

以上で完了です。

おまけ

閲覧数を表示するのに使いやすいものがFontAwesomeにあったので追記しておきます。

show.html.erb
<i class="far fa-eye"></i><%=  @post.impressionist_count %>


こんな感じになります!
気に入ったら使ってみてください。