使用
感觉我已经完全忘记了如何在离开rails几个月之后构建一个rails搜索。
Orders has_many Items
。
项目包含字符串status
:in_progress
,canceled
,completed
。
它们的布尔值也为acquired
。
所以,我想找到所有'准备完成'orders
,也就是说,订单包含至少有一个项目的所有项目(状态in_progress
和{{1} }),任何非in_progress都是状态acquired
或状态canceled
。
但我不知道如何构建一个只返回具有满足这些条件的 all 项的订单的查询。我有一个包含3个项目的订单,所有订单都是in_progress,其中一个是获得的。
completed
这将返回orders = Order.includes(:items).where(items: { status: "in_progress", acquired: true })
,急切加载Order
的{{1}}。但我需要一个不会返回任何订单的查询,因为并非所有项目都符合条件。但我不知道从哪里开始,并且试图寻找这个问题一直很困难。
我需要检查至少有一个项目是{Item
和acquired
)任何不是in_progress
或acquired
的项目,并且所有项目都是这样的方式。
任何对正确方向的推动都会非常感激!
答案 0 :(得分:1)
Rails ActiveModel还不支持OR
个查询,因此请尝试使用arel来构建复杂的查询。
答案 1 :(得分:1)
我不熟悉Postgresql语法,但在Mysql中如果要选择所有项目都在“正在进行中”的订单,你应该像这样做:
SELECT orders.* FROM orders LEFT JOIN items ON items.order_id = orders.id AND items.status!='in progress' WHERE items.id IS NULL;
OR
SELECT orders.* FROM orders INNER JOIN items ON items.order_id = orders.id GROUP BY items.order_id HAVING COUNT(items.id)=SUM(CASE WHEN items.status='in progress' THEN 1 ELSE 0 END);
我想在ActiveRecord中:
Order.joins("items ON items.order_id = orders.id AND items.status!='in progress'").where("items.id IS NULL")