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 %>

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

▲一覧画面でPVを表示した場合。
まとめ
Impressionistを使用すればRailsアプリケーションで簡単にPVを計測できそうです。session_hashの修正は今後に期待です。