如何基于Session统计Blog模型的view_number?求解决方案
基于Session实现博客浏览量去重统计
嘿,我懂你想要的效果——同一个会话里反复刷新同篇博客,浏览量只算一次对吧?这确实比现在刷新就计数要合理,能避免无效的重复统计。咱们可以通过Session记录用户已浏览的博客ID来实现这个需求,具体修改如下:
1. 修改控制器中的统计逻辑
核心思路是:在调用Worker更新浏览量之前,先检查当前Session里是否已经记录过这篇博客的ID。如果没记录过,才执行统计操作,同时把ID存入Session;如果已经有记录,就直接跳过。
修改后的Home::BlogsController代码:
class Home::BlogsController < Home::BaseController #... def show update_blog_view_number end private def update_blog_view_number # 从Session中获取已浏览的博客ID列表,初始化为空数组 viewed_blog_ids = session[:viewed_blog_ids] || [] # 检查当前博客ID是否不在已浏览列表中 unless viewed_blog_ids.include?(@blog.id) # 调用Worker更新浏览量 Home::UpdateBlogViewNumberWorker.perform_async(@blog.id) # 将当前博客ID存入Session,避免重复统计 session[:viewed_blog_ids] = viewed_blog_ids << @blog.id end end end
2. Worker代码无需修改
你的UpdateBlogViewNumberWorker逻辑本身没问题,不需要做改动——它只负责接收ID并更新数据库里的浏览量就行。
为什么这样做?
- Session是和用户当前浏览器会话绑定的,只要用户不关闭浏览器或者Session不过期,同篇博客就只会被统计一次,完全符合你想要的“基于Session统计”的效果。
- 这种实现方式轻量,不需要额外的数据库表,直接利用Rails自带的Session机制就能搞定。
如果之后你想要更进一步(比如登录用户跨会话也不重复统计),那可以在用户表加一个viewed_blog_ids字段,把已浏览记录存在用户模型里,但当前需求用Session就完全足够啦~
内容的提问来源于stack exchange,提问作者leafeve
相关产品推荐
相关产品推荐

