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

时间:2013-01-08 05:32:47

标签: sql ruby-on-rails-3 postgresql

使用

  • Rails 3.2.8
  • Ruby 1.9.3
  • PostgreSQL的
  • Ubuntu 12.10。

感觉我已经完全忘记了如何在离开rails几个月之后构建一个rails搜索。

Orders has_many Items

项目包含字符串statusin_progresscanceledcompleted。 它们的布尔值也为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}}。但我需要一个不会返回任何订单的查询,因为并非所有项目都符合条件。但我不知道从哪里开始,并且试图寻找这个问题一直很困难。

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

任何对正确方向的推动都会非常感激!

2 个答案:

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