2016-04-16 6 views
2

Lassen Sie uns sagen, Unternehmen has_many MitarbeiterSchienen hat viele Beziehungen in umfasst where Klausel

Ich möchte alle Unternehmen, dass es Mitarbeiter sind alle weiblich.

Aber der folgende Code wird alle Unternehmen zurückgeben, die mindestens eine Frau hat.

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

Welche Datenbank benutzen Sie? –

+0

@AnthonyE Postgres – etlds

Antwort

0

Wenn Sie Postgres verwenden, können Sie eine INNER JOIN zwischen Unternehmen und Mitarbeitern tun, dann verwenden GROUP BY company_id dann ein HAVING zu

Die SQL würde wie folgt aussehen:

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 

Die mit Klausel ist ein bisschen schwierig. Die COUNTD(employees.gender) == 1 stellt sicher, dass Firmenangestellte alle vom gleichen Geschlecht sind, die MAX(CASE employees.gender = 'female' THEN 1 ELSE 0) > 0 stellt sicher, dass das Geschlecht weiblich ist (der MAX würde 0 bewerten, wenn sie alle männlich wären).

Und das Active gleichwertig aussehen würde:

Companies.joins(:employees).group("companies.id").having("COUNTD(employees.gender) == 1 AND MAX(CASE employees.gender = 'female' THEN 1 ELSE 0) > 0") 

Beachten Sie, dass einige dieser ist datenbankspezifisch, also wenn Sie mich irgendwelche Fehler lassen kennen.