Rails查找具有相同子对象的所有对象



使用

  • 轨道3.2.8
  • 红宝石1.9.3
  • Postgresql
  • Ubuntu 12.10

在离开铁轨几个月后,我感觉自己完全忘记了如何进行铁轨搜索。

CCD_ 1。

项具有字符串status:in_progresscanceledcompleted。它们还有一个布尔值acquired

因此,我想找到所有"准备完成"的orders,也就是说,所有项目至少有一个项目(状态为in_progressacquired(的订单,而任何不在进度中的订单都是状态Orders has_many Items0或状态completed

但我不知道如何构造一个查询,该查询只返回具有所有项都满足这些条件的订单。我有一个订单,有3个项目,都在进行中,一个是已获取的。

orders = Order.includes(:items).where(items: { status: "in_progress", acquired: true })

这将返回Order,急切地加载作为acquired的1个Item。但我需要一个不会返回任何订单的查询,因为并非所有项目都符合条件。但我不确定从哪里开始,试图寻找这个问题真的很困难。

我需要检查至少有一个项目是(in_progressacquired(,任何不是的项目都是canceledcompleted,并且所有项目都是这样的。

如果能朝着正确的方向努力,我们将不胜感激!

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")

相关内容

  • 没有找到相关文章

最新更新