Active Record, к сожалению, не имеет API для этого.
Если вам нужно всего несколько известных категорий, вы можете сделать это, добавив пользовательскую ассоциацию:
class Customer ..
has_many :beverage_orders, -> { includes(products: :categories).where(categories: { category_name: "Beverages" }) }, class_name: "Order"
(а затем Customer.includes(:beverage_orders)
)
Если вам нужно поддерживать произвольные категории, ваши варианты становятся еще хуже ... если клиентов достаточно мало, я мог бы просто пропустить включение и принять N +1 запрос.
В противном случае, следующий наименее плохой вариант, который я могу предложить, - выполнить запрос самостоятельно:
customers = Customer.all # or whatever
beverage_orders = Order.includes(products: :categories).
where(categories: { category_name: "Beverages" }).
where(customer_id: customers).
group_by(&:customer_id)
customers.each do |customer|
puts "#{customer.name} ordered #{beverage_orders[customer.id].size} beverages"
# i.e., use `beverage_orders[customer.id]` instead of `customer.orders`
end