2016-09-23 4 views
1

У меня возникли проблемы с запросом, над которым я работал. Я хочу включить условие с этим.rails присоединяется к запросу с условиями

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

Это будет возвращать правильное количество мне нужно, но я ищу, чтобы добавить условие .joins(foo: [:foo_items]) Я только хочу, чтобы вернуть foo_items если foo.order_status.code != "cancelled"

Update:

Раньше я не сделал упомяните, что foo может иметь_many 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, и они находятся в разных состояниях (например, некоторые из них« отменены », но текущий« открыт »). Затем он хотел бы создать ассоциацию' has_one: current_order_status', если только заботится о текущем возможно или 'has_many: cancel_order_status', если он волнуется, если он когда-либо был отменен – drhenner

+0

@drhenner, судя по файлу OP foo.order_status.code, его has_one, поэтому не стесняйтесь сбрасывать пальцы;) –

+0

Если это принадлежит__ o более быстрый запрос состоял бы в кэшировании 'order_status_id', который ==« отменен ». то '.where.not (foo: {order_status_id: OrderStatus.CANCELED_ID})' без дополнительного order_status join – drhenner