rails在每个do循环中形成嵌套哈希

时间:2014-06-14 02:42:00

标签: ruby-on-rails ruby-on-rails-4

这是我的方法

  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 将包含手机品牌列表。但我的上面的方法只打印一个子类别,因为名称是可变的,但如何创建嵌套的哈希。

任何其他正确的方法

1 个答案:

答案 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