私は、商品アイテムモデルとhas_many関係のPurchaseOrderモデルを持っています。 PurchaseOrderモデルとLine Itemモデルはどちらも、Deliveryモデルとhas_many関係にあります。 Deliveryモデルには "expected_arrival"属性があります。Tricky Rails 5 ActiveRecord "where"複数の関連モデルと "or"演算子を含むクエリ
a)注文の配信には、昨日またはそれ以前の "expected_arrival"属性があります。 b)注文の広告申込情報のいずれかに、 expected_arrival」昨日の属性またはそれ以前
私はRailsの5 or
演算子を使用することを計画していたが、joins
またはincludes
でor
を組み合わせたときに明らかに既知のバグがRailsのであります。
https://github.com/rails/rails/issues/24055
私はそのようにように、group
とhaving
を使用してみました:
ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR: invalid reference to FROM-clause entry for table "deliveries"
LINE 1:
はPurchaseOrder.left_joins(:deliveries, {line_items: :deliveries})
.group("purchase_orders.id")
.having("MAX(line_items.deliveries.expected_arrival) <= ?
OR MAX(deliveries.expected_arrival) <= ?",
Time.now,
Time.now)`
これは、次のエラーが発生し...」purchase_orders.id HAVING BY NULL GROUPは(IS MAX(line_items ... ^ ヒント:テーブル "配送"のエントリがありますが、クエリのこの部分から参照することはできません。 `
これは、Railsは次のクエリのそれぞれが、自身で動作しますので、私は、このように配達テーブルにアクセスすることはできません私に言っているのは奇妙だ:
PurchaseOrder.left_joins(:deliveries).group("purchase_orders.id").having("MAX(deliveries.expected_arrival) <= ?", Time.now)`
PurchaseOrder.left_joins({line_items: :deliveries}).group("purchase_orders.id").having("MAX(deliveries.expected_arrival) <= ?", Time.now)`
私は、データベースにすることを避けるしたいと思います呼び出し、私はもともとor
クエリを使用したかったのです。ご覧のとおり、最後の2つのクエリの両方で、私は単にline_items.deliveries.expected_arrival
の代わりにdeliveries.expected_arrival
を参照しています。私はこれがRailsに問題があると仮定しており、何とかline_items.deliveries
という別名を付ける必要があることを意味しています。
これは正しい仮定ですか?もしそうなら、私はそれについてどのように行くだろうか?そうでない場合は、このクエリを構造化する正しい方法は何ですか?
う[この回答](https://stackoverflow.com/a/4795633/8088139)のようなものは、私は多くはバニラSQL対Railsのコマンドを好む –
を助けます。 –
は、 'Delivery'モデルが' PurchaseOrder'/'LineItem'との多相関連を持っていますか、それともそれぞれに対して外部キーを持っていますか? –