Active Record查询以匹配每个子集元素

时间:2014-02-18 13:01:31

标签: sql ruby-on-rails ruby activerecord

在我的RoR应用程序中,我有一个类似于这个的数据库查找:

Client.joins(:products).where({'product.id' => [1,2,3]})

不幸的是,这将返回已购买产品1,2或3的所有客户,但我只想取回客户,购买三种产品的全部。换句话说,我想编写一个匹配给定集合中n个元素的查询。

对此有什么优雅的解决方案吗?

2 个答案:

答案 0 :(得分:7)

这不是很优雅。但它应该转化为所需的SQL。

Client.joins(:products).
       where({'products.id' => [1,2,3]}).
       group('users.id').
       having('COUNT(DISTINCT products.id) >= 3')

答案 1 :(得分:4)

相同的答案以更动态的方式

ids = [1,2,3]

Client.joins(:products).
       where({'products.id' => ids}).
       group('users.id').
       having('COUNT(DISTINCT products.id) >= ?', ids.size)