activerecord存在子查询

时间:2015-04-01 03:41:36

标签: ruby-on-rails activerecord

我有以下两种模式:

class Client < ActiveRecord::Base
  has_many :orders
end

class Order < ActiveRecord::Base
  belongs_to :client
end

我想使用列表中指定的订单(order_1,order_2)查询客户,同时,客户需要所有订单。我可以通过下面的SQL来做到这一点:

SELECT *
FROM CLIENTS C
JOIN ORDERS O
ON C.ID = O.CLIENT_ID
WHERE EXISTS
  (SELECT *
  FROM CLIENTS C1
  JOIN ORDERS O1
  ON C1.ID = O1.CLIENT_ID
  WHERE O1.ID IN ('order_1', 'order_2')
  AND C1.ID = C.ID
  );

有没有办法以rails方式执行此操作?以下代码将给出满意的客户端,但client.orders仅返回指定的订单。

clients.includes(:orders).where(orders: { id: ['order_1', 'order_2'] })

我不知道如何在一个查询中获取所有信息。

2 个答案:

答案 0 :(得分:0)

我知道这是多年之后,但是这里是如何做到的(基于this blog post)。

Order.where(client_id:
  Client.joins(:orders)
    .where(orders: {id: ['order_1', 'order_2']})
    .select(:id)
)

答案 1 :(得分:0)

可以做到这一点的宝石:activerecord_where_assoc(我是作者)

有了它,您可以按照以下方式做您想做的事情:

clients.includes(:orders).where_assoc_exists(:orders, id: ['order_1', 'order_2'])

如果没有宝石,这样做很容易犯错或产生令人讨厌的副作用,例如您提到的没有每条记录的副作用。这是有关the problems的完整文档。

documentation中了解更多信息。这是introductionexamples