【Rails】PV数閲覧数機能（メモ）



#やり方

まず`Gemfile`に`impressionist`を追記。

```ruby:Gemfile
gem 'impressionist'
```

```:ターミナル
$ bundle install
```
次に`impressionist`テーブルを作成します。
　

```:ターミナル
$ rails g impressionist
```

マイグレーションファイルが生成されるので`rails db:migrate`をします。

```ruby:
class CreateImpressionsTable < ActiveRecord::Migration[6.1]
  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, %i[impressionable_type message impressionable_id],
              name: 'impressionable_type_message_index', unique: false, length: { message: 255 }
    add_index :impressions, %i[impressionable_type impressionable_id request_hash], name: 'poly_request_index',
                                                                                    unique: false
    add_index :impressions, %i[impressionable_type impressionable_id ip_address], name: 'poly_ip_index',
                                                                                  unique: false
    add_index :impressions, %i[impressionable_type impressionable_id session_hash], name: 'poly_session_index',
                                                                                    unique: false
    add_index :impressions, %i[controller_name action_name request_hash], name: 'controlleraction_request_index',
                                                                          unique: false
    add_index :impressions, %i[controller_name action_name ip_address], name: 'controlleraction_ip_index',
                                                                        unique: false
    add_index :impressions, %i[controller_name action_name session_hash], name: 'controlleraction_session_index',
                                                                          unique: false
    add_index :impressions, %i[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
```

```:ターミナル
$ rails db:migrate
```
次にpostテーブルにカラムを追加する。

```:ターミナル
$ rails g migration AddImpressionsCountToPosts impressions_count:integer
```
マイグレーションファイルが生成されたら、`defaurult: 0` を追記して`rails db:migrate`します。


```ruby
class AddImpressionsCountToPosts < ActiveRecord::Migration[6.1]
  def change
    add_column :posts, :impressions_count, :integer, default: 0
  end
end
```


```:ターミナル
$ rails db:migrate
```
postモデルに`is_impressionable counter_cache: true`追記していきます。

```ruby:app/models/post.rb
class Post < ApplicationRecord
  is_impressionable counter_cache: true
```
postコントローラーに追記していきます。

```ruby:aap/controllers/posts_controller.rb
 def show
    @post = Post.find(params[:id])
    impressionist(@post, nil, unique: [:ip_address])
 end
```
同じ人が何度か閲覧しても１PVのカウントになります。

ビューに記述。

```erb:app/views/show.html.erb
<p><%= post.impressions_count %></p>
```

これで閲覧数が表示されます。