0

使用

  • 导轨 3.2.8
  • 红宝石 1.9.3
  • PostgreSQL
  • Ubuntu 12.10。

感觉就像我在离开 Rails 几个月后完全忘记了如何构建 Rails 搜索。

Orders has_many Items.

项目有字符串status: in_progress, canceled, completed. 他们也有一个布尔值acquired

所以,我想找到所有 'ready to complete' orders,也就是说,所有项目的订单至少有一个项目具有(状态in_progressacquired),任何不是 in_progress 的都是状态canceled或状态completed

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

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

这将返回Order1Itemacquired. 但我需要一个不会返回任何订单的查询,因为并非所有项目都符合条件。但我不知道从哪里开始,试图寻找这个问题真的很困难。

我需要检查至少一个项目是 (in_progressacquired) 任何不是canceledorcompleted的项目,并且所有项目都是这种方式。

任何朝着正确方向的推动将不胜感激!

4

2 回答 2

1

Rails ActiveModel 还不能OR很好地支持查询,所以尝试使用arel来构建复杂的查询。

于 2013-01-08T06:38:46.147 回答
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;

或者

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")
于 2013-01-08T07:25:51.287 回答