Один из вариантов заключается в том, чтобы поставить shipment_count на заказ, где он будет автоматически обновляться с количеством отправлений, которые вы прикрепляете к нему. Тогда вы просто
Order.all(:conditions => [:state => "authorized", :shipment_count => 0])
В качестве альтернативы, вы можете получить ваши руки грязные с некоторыми SQL:
Order.find_by_sql("SELECT * FROM
(SELECT orders.*, count(shipments) AS shipment_count FROM orders
LEFT JOIN shipments ON orders.id = shipments.order_id
WHERE orders.status = 'authorized' GROUP BY orders.id)
AS order WHERE shipment_count = 0")
Проверьте, что перед использованием, поскольку SQL не совсем мой мешок, но я думаю, что это близко направо. Я получил его для работы на аналогичных устройствах объектов на моей производственной БД, которая является MySQL.
Обратите внимание, что если у вас нет указателя на orders.status, я бы настоятельно советовал ему!
Что делает запрос: подзапрос захватывает все количество заказов для всех заказов, находящихся в разрешенном состоянии. Внешние фильтры запросов, которые перечислены только для тех, у которых количество отправлений равно нулю.
Там, наверное, еще один способ, которым Вы могли бы сделать это, немного парадоксально:
"SELECT DISTINCT orders.* FROM orders
LEFT JOIN shipments ON orders.id = shipments.order_id
WHERE orders.status = 'authorized' AND shipments.id IS NULL"
захватить все заказы, которые уполномочены и не имеют запись в таблице отгрузок;)
Это не сработает. Поскольку это ассоциация has_many, внешний ключ хранится в таблице отправлений. –
Вот почему мы присоединяемся к идентификатору NULL –
Право, мое плохое (я сосать на SQL). Во всяком случае, это работает, за исключением того, что вам нужно заменить «статус» на «состояние» (для моего конкретного случая) и добавить «и» перед «shipmentments.id». Внесите эти изменения, и я отвечу на этот вопрос. –