如何在Ruby on Rails中编写统计文章评论数量的类方法
实现方案
首先需要先给Article模型配置和Comment的关联,代码如下:
class Article < ApplicationRecord # dependent: :destroy 配置为删除文章时同步删除对应关联评论 has_many :comments, dependent: :destroy end
根据你的需求分两种场景实现:
场景1:类方法统计所有文章的总评论数
你给出的class_methods块一般写在Article模型的关注点(Concern)中,直接按以下代码完善即可:
class_methods do def comment_count # 内连接关联评论表,自动过滤article_id无效的异常评论数据 joins(:comments).count # 如果需要按状态过滤,比如只统计公开文章、已审核评论的总数,可修改为: # joins(:comments).where(articles: {status: "public"}, comments: {status: "approved"}).count end end
调用方式:执行Article.comment_count即可拿到所有文章的评论总数量。
场景2:统计单篇文章的评论数(更常用场景,你可能误写为类方法)
如果是要获取某一篇具体文章的评论数,用实例方法即可,不需要写在class_methods块中:
# 直接写在Article模型代码里 def comment_count comments.count # 要过滤评论状态的话修改为: # comments.where(status: "approved").count end
调用方式:执行@article.comment_count即可拿到当前文章的评论数量。
小提示:如果该统计字段查询频率很高,推荐使用Rails自带的计数器缓存功能,在articles表新增
comments_count整数列,关联配置改为has_many :comments, dependent: :destroy, counter_cache: true,Rails会自动维护该计数字段,无需每次查询都执行count操作,大幅提升性能。
内容的提问来源于stack exchange,提问作者Vagner Wentz
相关产品推荐
相关产品推荐

