首页 > 解决方案 > 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)。

标签: ruby-on-railsjoincount

解决方案


你应该看看 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.

推荐阅读