我正在使用has_ancentry gem,并且我希望类别计数是这种格式
“技术/笔记本电脑(50)”
其中“技术”是父类别。 “笔记本电脑”是子类别,“ 50”是分组查询的数量
categories = Category.joins(:products)
.where(products: {id: @products})
.group(:id, :name)
.count
问题在于,这样我只能获得子类别的“ ID”。如果要检索“父”类别,则必须具有活动记录对象(因为has_ancestry .parent()是方法对象,而不是数据库列)
模型
class Category < ApplicationRecord
has_ancestry
has_many :products, dependent: :destroy
类别
create_table "categories", force: :cascade do |t|
t.string "name"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "ancestry"
t.index ["ancestry"], name: "index_categories_on_ancestry"
end
答案 0 :(得分:0)
我有点困惑要理解一个问题。
但是我有一些解决方案。
祖先宝石不支持关联的查询界面
所以我用
肮脏的方式:导致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})" }
短路2:它会导致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})" }
这看起来有些复杂,但是只有两个查询。
它在您的计算机中需要更多的计算能力。