RailsでImpressionistを使用してPVを計測する方法

S 20220628 161931

Railsでページ毎の閲覧数(PV)を計測したい場合「Impressionist」というgemを使うのが定番のようです。

Google Analyticsで計測したアクセス数をアプリケーションから利用したい場合は、APIを使ってデータを持ってくる必要がありますが、Impressionistを使えばRailsのモデル経由で統計情報に素早くアクセスすることができます。

以下使用方法を説明します。

インストール方法

Gemfileに以下を追加します。

gem 'impressionist'

ターミナルで以下のコマンドを実行します。

bundle install 

必要なファイルを作成します。

bundle exec rails g impressionist

migrationを実行します。

rake db:migrate

これで準備は完了です。情報は以下のテーブルに保存されます。


  create_table "impressions", force: :cascade 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.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.index ["controller_name", "action_name", "ip_address"], name: "controlleraction_ip_index"
    t.index ["controller_name", "action_name", "request_hash"], name: "controlleraction_request_index"
    t.index ["controller_name", "action_name", "session_hash"], name: "controlleraction_session_index"
    t.index ["impressionable_type", "impressionable_id", "ip_address"], name: "poly_ip_index"
    t.index ["impressionable_type", "impressionable_id", "params"], name: "poly_params_request_index"
    t.index ["impressionable_type", "impressionable_id", "request_hash"], name: "poly_request_index"
    t.index ["impressionable_type", "impressionable_id", "session_hash"], name: "poly_session_index"
    t.index ["impressionable_type", "message", "impressionable_id"], name: "impressionable_type_message_index"
    t.index ["user_id"], name: "index_impressions_on_user_id"
  end

使用方法

計測したいモデルを変更します。例えば本(Book)の情報を閲覧できるRailsアプリケーションの場合、Bookモデルに「is_impressionable」を追加します。

class Book < ApplicationRecord
  is_impressionable
end

本の情報を表示(show)したタイミングでPVをカウントしたい場合、BooksController#showでimpressionistメソッドを呼び出します。

  def show
    impressionist(@book, nil, :unique => [:ip_address])
  end

「:unique」のところがポイントで、「:ip_address」だとIPアドレスが同じアクセスを同一だとみなします。セッションで判断する「:session_hash」も指定できるはずですが、ブラウザでいきなりshowを呼び出すと(http://localhost:3000/books/1 を開くと)、「undefined method `cookie_value’ for nil:NilClass」というエラーが表示されたので使うのをやめました。記事執筆時Impressionist v2.0.0ではまだ修正されていないようです。

あとはビューファイルを変更してアクセス数を表示します(表示しなくても良いですが)。

ページビュー: <%= @book.impressionist_count %>
S 20220628 164622

▲閲覧画面でPVを表示した場合。

S 20220628 164627

▲一覧画面でPVを表示した場合。

まとめ

Impressionistを使用すればRailsアプリケーションで簡単にPVを計測できそうです。session_hashの修正は今後に期待です。