让我们说公司有很多员工
我想让所有公司的员工都是女性。
但是以下代码将返回所有至少有一名女性的公司。
Company.includes(:employees).where(employees: { gender: 'female'})
答案 0 :(得分:0)
如果您正在使用Postgres,则可以在公司和员工之间执行INNER JOIN
,然后GROUP BY company_id
然后使用HAVING
SQL看起来像:
SELECT companies.*
FROM companies
INNER JOIN employees ON employees.company_id = companies.id
GROUP BY companies.id
HAVING COUNTD(employees.gender) == 1 AND MAX(CASE employees.gender = 'female' THEN 1 ELSE 0) > 0
having子句有点棘手。 COUNTD(employees.gender) == 1
确保公司员工具有相同的性别,MAX(CASE employees.gender = 'female' THEN 1 ELSE 0) > 0
确保性别女性(如果他们都是男性,MAX将评估为0)。
ActiveRecord等价物看起来像:
Companies.joins(:employees).group("companies.id").having("COUNTD(employees.gender) == 1 AND MAX(CASE employees.gender = 'female' THEN 1 ELSE 0) > 0")
请注意,其中一些是特定于数据库的,因此如果您收到任何错误,请与我们联系。