#やり方
まずGemfile
にimpressionist
を追記。
Gemfile
gem 'impressionist'
ターミナル
$ bundle install
次にimpressionist
テーブルを作成します。
ターミナル
$ rails g impressionist
マイグレーションファイルが生成されるのでrails db:migrate
をします。
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
します。
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
追記していきます。
app/models/post.rb
class Post < ApplicationRecord
is_impressionable counter_cache: true
postコントローラーに追記していきます。
aap/controllers/posts_controller.rb
def show
@post = Post.find(params[:id])
impressionist(@post, nil, unique: [:ip_address])
end
同じ人が何度か閲覧しても1PVのカウントになります。
ビューに記述。
app/views/show.html.erb
<p><%= post.impressions_count %></p>
これで閲覧数が表示されます。