Rails:按用户分组项目,然后计数状态

Posted

技术标签:

【中文标题】Rails:按用户分组项目,然后计数状态【英文标题】:Rails: Group projects by user then status with a count 【发布时间】:2021-11-22 14:40:00 【问题描述】:

我正在尝试获取用户列表,以及他们在不同状态下拥有的项目的计数。

我有一个用户表,以下是我的项目表。

create_table :projects do |t|
  t.string      :slug, null: false
  t.belongs_to  :user
  t.string      :title
  t.text        :description
  t.integer     :is_status
end

在我的 user 模型中,我有项目所需的关联。

class User < ApplicationRecord
  has_many :projects

project 模型我已将关联添加到user

class Project < ApplicationRecord
  belongs_to        :user

现在我已经尝试过了..

Project.includes(:user).group(:user_id, :is_status)
.select(: user_id, :is_status, "SUM(is_status) as is_status_count").where.not
(user_id: 1).where.not(is_status: nil).order("user_id DESC").collect |a
| [a.user.name, a.is_status, a.is_status_count] 

但这不会返回易于阅读的内容。理想情况下,我更喜欢以下内容,当我构建前端时,猫头鹰会有所帮助。


  "user_1": 
    "status_1": 1,
    "status_2": 4,
    "status_3": 10
  

非常感谢任何帮助

【问题讨论】:

我是否正确理解您的查询正在按照您的意愿工作,您遇到的问题是如何将[["user_1", "status_1", 1], ["user_2", "status_1", 4]] 转换为"user_1": "status_1": 1,"status_2": 4 是的,基本上就是这样,我确信我错过了一些东西,但我一生都无法解决它。 【参考方案1】:

让我们从您已有的查询开始

relation = Project.includes(:user).group(:user_id, :is_status)
  .select(:user_id, :is_status, "SUM(is_status) as is_status_count").where.not
  (user_id: 1).where.not(is_status: nil).order("user_id DESC")

从那里开始,我们不想将它们收集到一个数组中,而是希望得到一个散列,每个user_id都有一个键

hash = relation.group_by  |project| project.user.name #  "user_1": [<#Project>, <#Project>] 

现在我们想把项目数组变成一个哈希,每个都有一个值

hash.transform_values do |projects|
  projects.map do |project|
    [project.is_status, project.is_status_count]
  end.to_h
end

【讨论】:

这太好了,谢谢你的帮助:)

以上是关于Rails:按用户分组项目,然后计数状态的主要内容,如果未能解决你的问题,请参考以下文章

按项目名称对交易进行分组

Linq 按连接表中的项目计数分组

mysql 计数,然后按该计数分组

MySQL:按连续天分组并计数组

如何按此哈希数组进行分组(可枚举)[Ruby,Rails]

如何使用 groupBy() 对 Collection 对象进行分组