Rails ActiveRecord返回相关表中id存在的记录

时间:2013-01-07 01:54:57

标签: ruby-on-rails activerecord active-record-query

我有一个客户端模型和一个产品型号,其中客户有许多产品,而产品属于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

4 个答案:

答案 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中了解更多信息。这是introductionexamples