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:按用户分组项目,然后计数状态的主要内容,如果未能解决你的问题,请参考以下文章