Đếm lượt view page bằng gem impressionist
Bạn muốn đếm số lượt view 1 trang, 1 sản phẩm, hay thậm chí đếm số lượt thực hiện 1 action nào đó. Bạn có thể thực hiện 1 cách thủ công bằng cách +1 vào 1 trường quy định số view trong db, nhưng như vậy thì việc config sẽ gặp nhiều rắc rối. Để việc đó trở nên dễ dàng hơn, tôi sẽ giớ thiệu cho bạn 1 ...
Bạn muốn đếm số lượt view 1 trang, 1 sản phẩm, hay thậm chí đếm số lượt thực hiện 1 action nào đó. Bạn có thể thực hiện 1 cách thủ công bằng cách +1 vào 1 trường quy định số view trong db, nhưng như vậy thì việc config sẽ gặp nhiều rắc rối. Để việc đó trở nên dễ dàng hơn, tôi sẽ giớ thiệu cho bạn 1 gem khá hữu ích cho việc này: gem impressionist
Thêm vào Gemfile
gem "impressionist"
Chạy lệnh Bundler
bundle install
Chạy lệnh generate
rails g impressionist
Chạy lệnh migration
rake db:migrate
thêm 1 cột trong bảng
rails g migration AddImpressionsCountToBook impressions_count:int
1.Ghi log tất các actions trong controller
WidgetsController < ApplicationController impressionist end
2.Ghi log 1 action đặc biệt nào đó của controller
WidgetsController < ApplicationController impressionist actions: [:show,:index] end
3 Chắc chắn trong model của bạn đã được thêm
class Widget < ActiveRecord::Base is_impressionable end
Sau khi thêm xong, giờ bạn có thể ghi log bất kì object nào của model với hành động tùy ý
def show @widget = Widget.find impressionist(@widget, "message...") # 2nd argument is optional end
4 Lấy số lượng log đã ghi được
@widget.impressionist_count @widget.impressionist_count(start_date: "2011-01-01", end_date: "2011-01-05") @widget.impressionist_count(start_date: "2011-01-01") # end date = now @widget.impressionist_count(filter: :ip_address) #filter theo địa chỉ ip @widget.impressionist_count(filter: :params) #filter theo param đặc biệc nào đó @widget.impressionist_count(:ilter: :session_hash) #filter theo session đăng nhập của user
Những phần trên ghi log lại đều có thể bị trùng lặp, vậy nên bạn có thể sử dụng 1 số config sau để tránh trùng lặp
Chỉ ghi log với những request không trùng type, id, session impressionist unique: [:impressionable_type, :impressionable_id, :session_hash]
Chỉ ghi log với những request không trùng controller, action, và session impressionist unique: [:controller_name, :action_name, :session_hash]
Hoặc đơn giản hơn là chỉ ghi log theo từng phiên làm việc impressionist unique: [:session_hash]
Chỉ ghi log với những request không trùng param impressionist :unique => [:params]
Bài viết mang tính giới thiệu, có điều gì sai sót mong bạn đọc bỏ qua