You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:25:40