Один из вариантов заключается в том, чтобы выставить shipment_count в Order, где он будет автоматически обновляться с учетом количества отправленных вами отправлений. Тогда вы просто
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"
Получить все заказы, которые авторизованы и не имеют записи в таблице отгрузок;)