使用
- 轨道3.2.8
- 红宝石1.9.3
- Postgresql
- Ubuntu 12.10
在离开铁轨几个月后,我感觉自己完全忘记了如何进行铁轨搜索。
CCD_ 1。
项具有字符串status
:in_progress
、canceled
、completed
。它们还有一个布尔值acquired
。
因此,我想找到所有"准备完成"的orders
,也就是说,所有项目至少有一个项目(状态为in_progress
和acquired
(的订单,而任何不在进度中的订单都是状态Orders has_many Items
0或状态completed
。
但我不知道如何构造一个查询,该查询只返回具有所有项都满足这些条件的订单。我有一个订单,有3个项目,都在进行中,一个是已获取的。
orders = Order.includes(:items).where(items: { status: "in_progress", acquired: true })
这将返回Order
,急切地加载作为acquired
的1个Item
。但我需要一个不会返回任何订单的查询,因为并非所有项目都符合条件。但我不确定从哪里开始,试图寻找这个问题真的很困难。
我需要检查至少有一个项目是(in_progress
和acquired
(,任何不是的项目都是canceled
或completed
,并且所有项目都是这样的。
如果能朝着正确的方向努力,我们将不胜感激!
Rails ActiveModel还不能很好地支持OR
查询,所以尝试使用arel来构建复杂的查询。
我不熟悉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;
或
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")