rails在where子句中有很多关系

时间:2016-04-16 02:56:26

标签: ruby-on-rails activerecord has-many

让我们说公司有很多员工

我想让所有公司的员工都是女性。

但是以下代码将返回所有至少有一名女性的公司。

Company.includes(:employees).where(employees: { gender: 'female'})

1 个答案:

答案 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")

请注意,其中一些是特定于数据库的,因此如果您收到任何错误,请与我们联系。