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

## はじめに
自作のアプリケーションで記事を投稿する機能をつける時に閲覧数を表示させたかったので、以下を参考に[impressionist](https://github.com/charlotte-ruby/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`ををみると第１引数に閲覧する記事のインスタンス、第２引数にオプション(今回は指定なし)、第３引数の`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 %>
```

![スクリーンショット 2021-06-07 22.45.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/991598/611343e9-3486-3087-1945-e0aada8ca590.png)
こんな感じになります！
気に入ったら使ってみてください。