0

使用する

  • レール 3.2.8
  • ルビー1.9.3
  • Postgresql
  • Ubuntu 12.10。

数か月レールから離れた後、レール検索を構築する方法を完全に忘れてしまったように感じます。

Orders has_many Items.

アイテムの文字列statusin_progress, canceled,completedです。のブール値もありacquiredます。

したがって、すべての 'ready to complete' を見つけたいと思います。つまり、 (statusおよび)ordersを持つアイテムが少なくとも 1 つあるすべてのアイテムと、in_progress でないアイテムはすべて statusまたは statusです。in_progressacquiredcanceledcompleted

しかし、これらの条件をすべて満たしているアイテムを持つ Orders のみを返すクエリを作成する方法がわかりません。3 つのアイテムを注文しました。すべてが進行中で、1 つが取得済みです。

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

Orderこれは、 を熱心にロードして 1Itemを返しacquiredます。しかし、すべてのアイテムが基準を満たしているわけではないため、注文を返さないクエリが必要です。しかし、どこから始めればよいかわかりません。この問題を探すのは本当に大変でした。

少なくとも 1 つのアイテムが (in_progressおよび) であり、またはでacquiredはないすべてのアイテムであり、すべてのアイテムがこのようであることを確認する必要があります。canceledcompleted

正しい方向へのプッシュは大歓迎です!

4

2 に答える 2

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 に答える
1

Rails ActiveModel はORまだクエリをうまくサポートしていないので、複雑なクエリを構築するためにarelを使用してみてください。

于 2013-01-08T06:38:46.147 に答える