这是我的方法
def categories
@categories = {}
cat = Category.includes(:sub_categories).where('categories.status = ?', true).order(:id)
cat.each do |category|
category.sub_categories.each do |sub_category|
@categories[category.name] = { name: sub_category.name }
end
end
end
我想做的是
假设我的 category.name 是手机,我的 sub_category.name 将包含手机品牌列表。但我的上面的方法只打印一个子类别,因为名称是可变的,但如何创建嵌套的哈希。
任何其他正确的方法
答案 0 :(得分:3)
那是因为你要覆盖每个子类别中的密钥。您必须为每个键存储一系列子类别:
{"name1"=>[{"subcategory1"=>...},{"subcategory2"=>...}],"name2"=>[]}
试试这个:
def categories
@categories = {}
cat = Category.includes(:sub_categories).where('categories.status = ?', true).order(:id)
cat.each do |category|
category.sub_categories.each do |sub_category|
@categories[category.name] = [] unless @categories[category.name]
@categories[category.name] << { name: sub_category.name }
end
end
end
如果category.status是一个布尔值,你可以这样做:
cat = Category.includes(:sub_categories).where(status: true).order(:id)
从控制器中删除sql查询,这很难看。
EDITED
只要您有数组哈希,为了呈现视图,您将不得不再次迭代:
@categories.each do |category, values|
values.each do |sub_category|
subcategory["what you need"]
end
end