поставки заказа has_manyИспользовать подсчет отношения has_many для выбора - используя наличие?
Орден имеет столбец number_of_deliveries_paid_for
Как выбрать все заказы, где число поставок (COUNT (deliveries.id)) меньше, чем number_of_deliveries_paid_for
На данный момент, Я делаю:
Order.joins('LEFT OUTER JOIN deliveries ON deliveries.order_id = orders.id')
.select('orders.*, COUNT(deliveries.id) AS delivery_count')
.select { |o| o if o.number_of_deliveries_paid_for > o.delivery_count }
Но это возвращает массив, было бы неплохо вернуть ActiveRecord :: Relation, и я думаю, было бы более эффективным, чтобы сделать это в SQL.
Update _ __ _ __ _ __ _ __ _ __
Это похоже на работу
Order.joins('LEFT OUTER JOIN deliveries ON deliveries.order_id = orders.id')
.group('orders.id')
.having('COUNT(deliveries.id) < orders.number_of_deliveries_paid_for')
я могу цепи других областей на конце из этого и т. д. Но если я добавлю .count
до конца, я получу ошибку
ActiveRecord::StatementInvalid: Mysql2::Error: Unknown column
'orders.number_of_deliveries_paid_for' in 'having clause':
SELECT COUNT(*) AS count_all, orders.id AS orders_id FROM `orders`
LEFT OUTER JOIN deliveries ON deliveries.order_id = orders.id GROUP BY orders.id
HAVING COUNT(deliveries.id) < orders.number_of_deliveries_paid_for
, что заставляет меня беспокоиться!
вы говорите, что группа по ... имея хороший способ сделать это? – Edward
Но мне нужно иметь все заказы, где нет поставок, поэтому мне нужно сделать левое соединение! – Edward
ОК, много изменений после ... По-видимому, работают два варианта (подзапрос и предложение 'having'). В обоих случаях я продлил тест, чтобы учесть случай отсутствия доставки заказа. По этой причине я снова представил «LEFT JOIN». –