Sql Rails查找具有相同子对象的所有对象
使用Sql Rails查找具有相同子对象的所有对象,sql,ruby-on-rails-3,postgresql,Sql,Ruby On Rails 3,Postgresql,使用 轨道3.2.8 Ruby 1.9.3 Postgresql Ubuntu 12.10 在离开rails几个月后,我感觉自己完全忘记了如何构建rails搜索 订单有很多项目 项目具有字符串状态:正在进行,已取消,已完成。 它们还有一个布尔值已获取 因此,我想查找所有“准备完成”的订单,也就是说,所有项目中至少有一个项目(状态正在进行中和已获取),而任何未进行中的订单都是状态已取消或状态已完成 但我不知道如何构造一个查询,该查询只返回包含所有满足这些条件的项的订单。我有一个3项的订单,全部
- 轨道3.2.8
- Ruby 1.9.3
- Postgresql
- Ubuntu 12.10
订单有很多项目
项目具有字符串状态
:正在进行
,已取消
,已完成
。
它们还有一个布尔值已获取
因此,我想查找所有“准备完成”的订单,也就是说,所有项目中至少有一个项目(状态正在进行中和已获取),而任何未进行中的订单都是状态已取消或状态已完成
但我不知道如何构造一个查询,该查询只返回包含所有满足这些条件的项的订单。我有一个3项的订单,全部都在进行中,一项已经获得
orders = Order.includes(:items).where(items: { status: "in_progress", acquired: true })
这将返回订单
,立即加载已获取的项目
。但是我需要一个不会返回任何订单的查询,因为不是所有项目都符合条件。但我不知道从哪里开始,试图寻找这个问题真的很困难
我需要检查是否至少有一个项目(正在进行中
和已获取
),是否有任何未取消的项目
或已完成
,并且所有项目都是这样
任何朝着正确方向的努力都将不胜感激 Rails ActiveModel还不支持或查询,所以请尝试使用它来构建复杂的查询。我不熟悉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;
或
我想在ActiveRecord中:
Order.joins("items ON items.order_id = orders.id AND items.status!='in progress'").where("items.id IS NULL")
我不能让这些工作,我想他们基本上只是找到任何订单与所有项目!正在进行中。但是,我需要找到所有正在进行和已获取的状态,或者未进行中的状态,而不是暂停的状态——还有一些其他状态是不可能的。所以,它们必须是特定的状态,或者在prog和acquired中,所有的项目都是这样。这些查询似乎只是查找没有进行中的项目的订单。但是,无可否认,我的sql非常糟糕。可能需要一个groupby,但不确定这些就是它。[cont]因此,我认为一个好的开始是找到所有订单中的项目都在进行中和处于占有状态,然后解决如何排除处于特定状态的非进行中项目。但是,我想我只是没办法弄明白。也许是时候花点时间认真学习SQL了。我也意识到我没有完全按照我的意思写(昨天很累):项目应该至少有一个正在进行并已获得,其余的可以取消或完成。我想我应该从查找所有正在进行和已获得的项目的订单开始。部分混乱可能是因为我说我想找到已完成的订单,而我真正的意思是几乎完成,他们基本上在等待另一件事情完成(在prog中并已获得)。
Order.joins("items ON items.order_id = orders.id AND items.status!='in progress'").where("items.id IS NULL")