2017-04-03 4 views
1

ich einen sehr Standard has_and_belongs_to_many Verein verwenden, wie das Beispiel in der Rails-Verbänden Führung: http://guides.rubyonrails.org/association_basics.html#the-has-and-belongs-to-many-associationhas_and_belongs_to_many paßt genau durch id

Das Problem ist, dass ich mit der genauen Übereinstimmung die Versammlung finden abfragen möchte von Teile. Zum Beispiel Montage mit 2 Parts zugeordnet sind, und die Teile-IDs von 1, 2.

Hier sind meine Ansätze, die fehlschlagen:

Assembly.joins(:parts).where(parts: {id: [1,2]}) 

Assembly.joins(:parts). 
    where('parts.id IN (?)', [1,2]). 
    group('assemblies.id'). 
    having('COUNT(assemblies.id) >= ?', [1,2].length) 

(Dieser durch das SO vorgeschlagen wurde beantworten: Rails scope - where in exact matches)

Diese Ansätze geben Assembly-Objekte zurück, für die nur Teile mit den IDs 1 und 2 in den zugehörigen Teilen enthalten sind. Aber was ich will, sind nur Assemblies mit genau diesen 2 Teilen (Id 1 und 2).

Bitte helfen!

+0

@jazzinthermorning, können Sie sagen, welche Datenbank verwenden Sie? –

+0

Ja, mit PostgreSQL – jazzinthemorning

Antwort

2

Update: Reihenfolge der Elemente in PostgreSQL-Arrays werden importiert. Es ist möglich, ORDER BY innerhalb ARRAY_AGG Funktion zu verwenden.

Assembly.joins(:parts). 
    group('assemblies.id'). 
    having('ARRAY[?] = ARRAY_AGG(parts.id ORDER BY parts.id)', [1,2].sort) 

Erste Version:

Wenn Sie PostgreSQL verwenden, können Sie es mit ARRAY_AGG Gruppenfunktion können:

Assembly.joins(:parts). 
    group('assemblies.id'). 
    having('ARRAY[?] = ARRAY_AGG(parts.id)', [1,2]) 
+0

Darüber hinaus ist die Reihenfolge mit Ihrer Abfrage wichtig, was nicht praktisch erscheint. Irgendeine Idee, wie die Assemblies, die die Part-IDs enthalten, ungeachtet der Reihenfolge abgeglichen werden, d. H. Dieselbe Assembly erhalten, wenn IDs wie [1,2] oder [2,1] übergeben werden? – jazzinthemorning

+0

Vielen Dank für das Update, ich hatte nicht an die order_by gedacht und sortieren, brilliant. – jazzinthemorning

+0

für Leute, die id als uuid in postgres haben, 'Assembly.joins (: parts). Gruppe ('assemblies.id'). having ('ARRAY [?] = ARRAY_AGG (parts.id::text ORDER BY parts.id::text)', ['1212-afzaz-12', '22412-afzafza- 1232 "]. Sortieren)" – Poilon