Я бы хотел повторить ответ @ Delba и расширить его, потому что он правильный - то, что @huan son предлагает в столбце count, совершенно не нужно, если ваши индексы настроены правильно.
Я бы добавил, что вы, вероятно, хотите использовать .uniq, так как вы хотите, чтобы возвращались только категории DISTINCT:
Category.joins(:items).uniq
Использование запроса на объединение позволит вам более легко работать с количеством элементов, что обеспечивает большую гибкость. Например, вы можете не захотеть считать элементы, где включено = false:
Category.joins(:items).where(:items => { :enabled => true }).uniq
Это сгенерирует следующий SQL-запрос, используя очень быстрые внутренние объединения:
SELECT `categories`.* FROM `categories` INNER JOIN `categories_items` ON `categories_items`.`category_id` = `categories`.`id` INNER JOIN `items` ON `items`.`id` = `categories_items`.`item_id` WHERE `items`.`enabled` = 1
Удачи,
Stu