ruby-on-rails - Rails:如何按连接表中的列分组
问题描述
我的模型看起来像这样:
class Task < ApplicationRecord
belongs_to :project
belongs_to :urgency
end
class Project < ApplicationRecord
has_many :tasks, dependent: :destroy
end
class Urgency < ApplicationRecord
has_many :tasks
end
我正在尝试在表格中显示每个项目的任务数。例如,我想查看表格显示项目 A 有 10 个任务,项目 B 有 7 个任务等。
此外,我希望能够仅显示每个项目中紧迫性高的任务数(这意味着从任务表中获取 urgency_id 并在紧急表中查找 urgency_name)。
解决方案
你应该看看 ActiveRecord 提供的group方法。下面是它生成的 SQL 示例:
用户组(:名称)
=> SELECT "users".* FROM "users" GROUP BY name
此外,您还应该看看 ActiveRecord 提供的count方法。下面是它生成的 SQL 示例:
Task.count(:project_id)
从“任务”中选择计数(“任务”、“项目 ID”)
我们可以将这两种方法结合起来得到每个项目的任务数。
Task.group(:project_id).count(:project_id)
# This returns {1=>2, 2=>3} in my database. This suggests, project1 has 2 tasks, project2 has 3 tasks
为了实现您的第二个要求,我们将需要使用 rails joins方法。
Task.joins(:urgency).where("urgencies.utype = 'High'").group(:project_id).count(:project_id)
# This returns {2=>1}, suggesting project 2 has 1 task where the urgency (utype) is high.
推荐阅读
- angular - Angular 组件 - 在运行时创建或使用数据参数静态创建
- oauth - 社交 oauth 如何真正发挥作用?
- node.js - 运行 2 个重复的异步函数,而不在 await 上暂停另一个
- sql - CASE 错误地返回 true
- angularjs - 升级以在 AngularJS 的指令中使用 $onInit
- udp - Google 计算引擎连接到本地 UDP 端口
- selenium - 如何在电子邮件(Outlook)正文中为测试执行摘要生成 HTML 表
- c# - 我们可以保留从.NET 创建的## 表,直到我从另一个过程执行我的代码?
- sql - 编写一个循环,引入两种不同的日期格式
- python - 如何在会话 SQLAlchemy 中获取对象的父对象