我有一个客户端模型和一个产品型号,其中客户有许多产品,而产品属于CLient。
我需要找到一个只返回客户的查询,如果他们在Product表中有记录
客户表
id | name
--------------
1 | Company A
2 | Company B
3 | Company C
产品表
id | name | client_id
---------------------------
1 | Product A | 1
2 | Product B | 1
3 | Product C | 3
4 | Product D | 3
5 | Product E | 1
我只需要客户1 3
例如
@clients = Client.where("client exists in products") #something to this effect
答案 0 :(得分:19)
最简单但不是最快的:
Client.where(:id => Product.select(:client_id).map(&:client_id))
SQL子查询(更快):
Client.where("EXISTS(SELECT 1 from products where clients.id = products.client_id)")
答案 1 :(得分:7)
这是另一种解决方案。这是像Valery的第二个解决方案的子查询,但没有写出sql:
Client.where(Product.where(client_id: Client.arel_table[:id]).exists)
答案 2 :(得分:6)
以下是使用Where Exists gem的解决方案(披露:我及其作者):
Client.where_exists(:products)
答案 3 :(得分:1)
另一个可以做到这一点的宝石:activerecord_where_assoc(我是作者)
使用它:
Client.where_assoc_exists(:products)
如果您还必须指定某些产品,那么何时可以这样:
Client.where_assoc_exists(:products, id: my_products.map(&:id))
没有宝石就能轻松犯错。
在documentation中了解更多信息。这是introduction和examples。