物件的瀏覽次數
功能製作教學
前情提要:
我想要查看每一間房子被不論是訪客還是使用者瀏覽的次數
安裝impressionist
$ bundle add impressionist
創建impressionist專用table
$ rails g impressionist
$ rails db:migrate
在想要查看瀏覽數的物件上做設定
在指定的controller、action加上這一段
# controllers/houses_controller.rb
class HousesController < ApplicationController
def show
# 計算瀏覽次數
impressionist(@house)
#...忽略
end
end
在指定的model加上這一段
class House < ApplicationRecord
is_impressionable
end
顯示瀏覽次數
> 同一個人一直刷新就可以增加好多次
> @house.impressionist_count(:filter => :all)
> 一個ip只顯示一次瀏覽量
> @house.impressionist_count(:filter => :session_hash)
> 一段時間內的瀏覽量
> @house.impressionist_count(:start_date: 1.day.ago, end_date: 1.day.from_now)
參考連結 : https://github.com/charlotte-ruby/impressionist
增加 counter_cache
counter_cache 是什麼?
counter_cache 是 Rails 中一種方便的緩存技術,可以使關聯對象的計數器被緩存在主對像中。 例如,在一個BLOG應用程式中,每篇文章都有很多評論。每次獲取文章時都要計算該文章的評論數,這會導致查詢頻繁和性能下降。 使用 counter_cache 技術,我們可以將文章的評論計數器緩存在文章中,以避免在每次獲取文章時重新計算評論數。
以我們現在的案例,要怎麼增加 counter_cache 呢?
1. 在 house 的 model 加上一個欄位
$ rails g migration add_counter_cache_to_house
# migration/add_counter_cache_to_house.rb
class AddCounterCacheToHouse < ActiveRecord::Migration[7.0]
def change
add_column :houses, :houses_count, :integer, default: 0
end
end
$ rails db:migrate
2. 在 house 的 model 增加一行
# house
class House < ApplicationRecord
is_impressionable :counter_cache => true, :column_name => :houses_count
# ... 略
end
這樣之後就可以把紀錄存取在 house 的這個欄位中
要怎麼確認 counter cache
有運作呢?只要有在 LOGS 中看到類似這種的CODE,就代表有在運作
17:01:37 web.1 | House Update All (1.1ms) UPDATE "houses" SET "houses_count" = COALESCE("houses_count", 0) + $1 WHERE "houses"."id" = $2 [["houses_count", 1], ["id", 13]]