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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 16:54:01