Ruby on rails Rails ActiveRecord/Arel查询聚合列和select()

Ruby on rails Rails ActiveRecord/Arel查询聚合列和select(),ruby-on-rails,arel,Ruby On Rails,Arel,我有两个带联接表的基本模型。我添加了一个作用域,用于通过关系计算计数,并将其作为attribute/psuedo列公开。一切正常,但我现在想查询列的子集并包含count列,但我不知道如何引用它 tldr;如何在Arel查询中包括一个聚合,如计数,同时选择列的子集? 模型包括雇主和员工,通过工作加入。以下是雇主提供的相关代码: class Employer < ApplicationRecord belongs_to :user has_many :jobs has_many :

我有两个带联接表的基本模型。我添加了一个作用域,用于通过关系计算计数,并将其作为attribute/psuedo列公开。一切正常,但我现在想查询列的子集并包含count列,但我不知道如何引用它

tldr;如何在Arel查询中包括一个聚合,如计数,同时选择列的子集?

模型包括
雇主
员工
,通过
工作
加入。以下是雇主提供的相关代码:

class Employer < ApplicationRecord
  belongs_to :user
  has_many :jobs
  has_many :employees, through: :jobs

  scope :include_counts, -> do
    left_outer_joins(:employees).
      group("employers.id").
      select("employers.*, count(employees.*) as employees_count")
  end
end
然后引用计数:

count = employers[0].employees_count
我将记录加载到我的控制器中,然后控制器将其呈现。不过,我不想渲染比需要更多的字段。在添加计数之前,我可以执行以下操作:

employers = Employer.where(id: 1).select(:id, :name)
当我添加我的
include\u counts
范围时,它基本上忽略了
select()
。它没有失败,但最终包含了所有列,因为我的作用域中有一行:

select("employers.*, count(employees.*) as employees_count")
如果我从范围中删除
employers.*
,那么无论是否使用
select()
子句,我都不会在结果中获得任何列

我试过这个:

employers = Employer.include_counts.where(id: 1).select(:id, :name, :employee_counts)
…但这会产生以下SQL:

SELECT employers.*, count(employees.*) as employees_count, id, name, employees_count FROM
…和SQL错误,因为列
employees\u count
不存在,并且
id
name
不明确

唯一有效的方法是:

employers = Employer.include_counts.where(id: 1).select("employers.id, employers.name, count(employees.*) as employees_count")
…但由于scope子句的原因,这实际上选择了
雇主
中的所有列

如果可以避免的话,我也不希望原始SQL泄漏到我的控制器中。对于Rails/Arel,有没有更惯用的方法

如果我找不到其他方法来执行查询,我可能会在模型中创建另一个作用域或自定义查找器,以便控制器代码更干净。我也愿意接受这样做的建议,但我想知道是否有一种简单的方法可以像引用任何其他列一样引用这样的计算聚合列

employers = Employer.include_counts.where(id: 1).select("employers.id, employers.name, count(employees.*) as employees_count")