2017-04-03 24 views
1

匹配我使用的是非常標準的has_and_belongs_to_many協會,像在Rails的協會指導的例子: http://guides.rubyonrails.org/association_basics.html#the-has-and-belongs-to-many-associationhas_and_belongs_to_many確切的ID

的問題是,我想查詢查找與大會的精確匹配部分。例如, 大會與相關聯的這2份和1 ID的零件,2

下面是我失敗的方法:

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) 

(這一次被這個建議SO回答: Rails scope - where in exact matches

這些方法返回包含相關零件中包含ids 1和2的零件的Assembly對象。但是,我想要的僅僅是具有這2個部件的組件(ids 1和2)。

請幫忙!

+0

@jazzinthermorning,你可以說,你使用的是什麼數據庫? –

+0

是的,使用PostgreSQL – jazzinthemorning

回答

2

更新: PostgreSQL數組中元素的順序是導入。在ARRAY_AGG函數中可以使用ORDER BY

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

第一個版本:

如果您正在使用PostgreSQL,你可以用ARRAY_AGG組功能做到這一點:

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

此外,使用您的查詢,訂單很重要,這似乎不實際。不管順序如何匹配包含部件標識的部件,即在傳遞ids作爲[1,2]或[2,1]時獲得相同的組件? – jazzinthemorning

+0

謝謝你的更新,我沒有想到order_by和排序,輝煌。 – jazzinthemorning

+0

對於那些在postgres中有id爲uuid的人,'Assembly.joins(:parts)。 group('assemblies.id')。having('ARRAY [?] = ARRAY_AGG(parts.id::text ORDER BY parts.id::text)',['1212-afzaz-12','22412-afzafza- 1232' ]。排序)' – Poilon