我有以下两种模式:
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'] })
我不知道如何在一个查询中获取所有信息。
答案 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中了解更多信息。这是introduction和examples。