2016-09-23 14 views
1

私が取り組んでいるクエリに問題があります。私はこれに条件を入れたいと思う。railsが条件付きでクエリに参加します

FooDiscount.where(bar_code_id: object.id).joins(foo: [:foo_items]).sum(:quantity) 

これは私が必要とする正確な数量を返しますが、私は私が唯一の更新

foo.order_status.code != "cancelled"場合 foo_itemsを返すようにしたい .joins(foo: [:foo_items])に条件を追加するために探しています:私はしなかった以前の

fooには、order_statusesがあります。そのクエリは私に間違った結果を与えています。混乱させて申し訳ありません。

答えて

1

order_status場合は、これらの線に沿って何かする必要がありますデシベル担保モデルである(単数/複数の問題かもしれませんが、あなたのアイデアを得る):私は親指アップだけには約

FooDiscount 
    .where(bar_code_id: object.id) 
    .joins(foo: [:foo_items, :order_statuses])   # edit joining 
    .where.not(order_statuses: { code: 'cancelled' }) # your condition 
    .sum('foo_discounts.quantity')     # ensure no issues with determining, 
                # which table's column quantity is 
+0

ました'foo' has_many:order_statusとは異なる状態にあります(いくつかは 'キャンセル'されていますが、現在のものは 'open'です)。次に、現在の可能性を気にするだけならば、' has_one:current_order_status'というアソシエーションを作成したいでしょう。彼がこれまでにキャンセルされているかどうか気にするならば、 'has_many:cancelled_order_status' – drhenner

+0

@drhennerは、OPのfoo.order_status.codeからhas_oneと判断していますので、躊躇しないでください) –

+0

それはbelongs_tより速いクエリは、== "cancelled"という 'order_status_id'をキャッシュすることです。追加のorder_status joinを使わずに '.where.not(foo:{order_status_id:OrderStatus.CANCELED_ID})'を実行しました – drhenner