Rails中按用户、项目状态分组统计对应项目数量的实现咨询
实现方案
原有代码问题说明
你写的代码存在两个核心问题:
- 统计逻辑错误:
SUM(is_status)是对is_status字段的值求和,而非统计对应状态的项目条数,不符合统计数量的需求 - 结果结构错误:
collect返回的是二维数组,没有转换成前端需要的嵌套哈希结构,可读性差
具体实现代码
# 第一步:按用户ID、项目状态分组统计项目数量,仅用1次SQL查询拿到所有统计结果 grouped_counts = Project.where.not(user_id: 1) .where.not(is_status: nil) .group(:user_id, :is_status) .count # 第二步:批量获取涉及的用户ID和用户名映射,避免N+1查询 # 如果你不需要用用户名作为外层key,想要用`user_用户ID`的格式作为key,可以直接跳过这一步 user_id_to_name = User.where(id: grouped_counts.keys.map(&:first).uniq) .pluck(:id, :name) .to_h # 第三步:组装成目标结构 result = {} grouped_counts.each do |(user_id, status), count| # 如果要使用`user_用户ID`作为外层key,把下面这行替换为 user_key = "user_#{user_id}" user_key = user_id_to_name[user_id] result[user_key] ||= {} result[user_key]["status_#{status}"] = count end
输出结构验证
最终得到的result完全符合你要求的格式:
{ "user_1": { "status_1": 1, "status_2": 4, "status_3": 10 } }
内容的提问来源于stack exchange,提问作者Alan
相关产品推荐
相关产品推荐

