如何使用impressionist gem按浏览量排序文章,实现热门文章组件?
解决按浏览量排序文章的问题
嘿,我之前用impressionist做过热门文章排序的功能,刚好能帮到你!给你两种可行的方案,从高效易用的开始说:
方案一:使用计数器缓存(推荐,性能更好)
这种方式会在数据库里直接维护一个浏览量计数字段,排序的时候不用做复杂的分组查询,速度更快。
- 添加计数器字段
先给articles表加一个impressions_count整数字段,默认值设为0:
rails generate migration AddImpressionsCountToArticles impressions_count:integer default:0 rails db:migrate
- 更新模型配置
在你的Article模型里开启counter_cache选项:
class Article < ApplicationRecord is_impressionable counter_cache: true end
这样每次有新的浏览记录时,impressionist会自动帮你更新impressions_count的值,不用自己写逻辑。
- 排序查询
现在按浏览量排序就超级简单了:
# 获取按浏览量从高到低的文章,可搭配limit取热门topN @popular_articles = Article.order(impressions_count: :desc).limit(10)
- 初始化已有数据的计数
如果你的数据库里已经有旧文章,需要手动同步一下它们的浏览量到计数器字段:
# 打开rails console运行 Article.find_each do |article| article.update(impressions_count: article.impressions.count) end
方案二:直接通过关联查询排序(无需修改表结构)
如果不想改数据库结构,可以直接通过关联impressions表来统计排序:
# left_joins确保没有浏览量的文章也会被包含进来,排在最后 @popular_articles = Article.left_joins(:impressions) .group('articles.id') .order('count(impressions.id) DESC')
不过这种方式每次查询都要做分组统计,文章数量多的时候性能会比方案一差一些。
另外要注意,如果你的impressionist设置了唯一浏览(比如is_impressionable unique: :session_hash),两种方案都会正确统计唯一会话的浏览量,不用担心重复计数的问题。
内容的提问来源于stack exchange,提问作者Lashe
相关产品推荐
相关产品推荐

