Я немного сбиваю с толку, чтобы понять проблему.
Но у меня есть некоторые решения.
гем предков не поддерживает интерфейс запросов для ассоциации
ТакЯ использую
грязным способом: это вызывает n + 1 проблему запроса
Category.joins(:products).where(products: {id: @products}).group(:id, :name).count
.map { |k, v| "#{Category.find(k.first).parent.name} / #{k.last} (#{v})" }
коротким путем: это вызывает n + 1 проблему запроса
Product.group(:category).size.map { |k, v| "#{k.parent.name} / #{k.name} (#{v})" }
short way2: этовызывает n + 1 проблему запроса
Category.includes(:products).map { |c| [c.parent&.name, c.name, c.products.size]}
Я хочу использовать необработанный запрос, но в настоящее время я не мог придумать хороший sql, извините,
обновить новый:
products = Product.group(:category).size
categories = Category.where(id: products.map(&:first).map(&:ancestry).uniq).pluck(:id, :name)
result = products.map { |child_category, total| "#{(categories.select { |c| c.first == child_category.ancestry.to_i }.map(&:last)).first} / #{child_category.name} (#{total})" }
Это выглядит несколько сложнее, но имеет только два запроса.
Требуется больше вычислительной мощности на вашем компьютере.