У меня две модели
class Checkout
has_one :order
end
class Order
belongs_to :checkout
end
Мне нужно найти все кассы, которые еще не заказаны. Как я могу сделать это с рельсами?
Хитрость заключается в том, что include() ожидает имя ассоциации, а where ожидает имя таблицы. Для has_one ассоциация обычно выражается в единственном числе, так что она меняется, но часть where() остается такой, как есть.
Checkout.includes(:order).where( :orders=> { :orders_id=> nil } )
where( :orders=> { :orders_id=> nil } )
будет выполнять запрос как .where('orders.order_id IS NULL)
в SQL, что приводит к неправильному ответу.
Используйте left outer join
, которое даст вам все проверки, объединенные с заказами. Затем выберите строки без заказов (order.id == nil
)
Chceckout.left_outer_join(:orders).where('orders.id' => nil)
Checkout.includes(:order).where(orders: { id: nil })
может перечислить их.