2017-04-03 19 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