2012-08-09 124 views
0

请原谅我的无知,我是Ruby的新手,但没有编程。我使用名为Ancestry的gem在我的应用程序中存储分层数据。他们有一个名为“后代”的方法,它返回所有降序子代,孙辈等的嵌套散列。在一个节点中,但我很难尝试遍历每个节点并输出所有子节点。需要帮助穿越嵌套散列

这里的数据结构是什么样子

{ 
    #<Forum id: 16, name: "Parent 1", ancestry: "7", display_order: 1> =>{}, 
    #<Forum id: 17, name: "Parent 2", ancestry: "7", display_order: 2> =>{}, 
    #<Forum id: 13, name: "Parent 3", ancestry: "7", display_order: 3> => 
    { 
    #<Forum id: 14, name: "Child 1", ancestry: "7/13", display_order: 1> =>{}, 
    #<Forum id: 15, name: "Child 2", ancestry: "7/13", display_order: 2> => 
    { 
     #<Forum id: 18, name: "Grand Child", ancestry: "7/13/15", display_order: 1> =>{}, 
    } 
    } 
} 

当我通过循环使用下面的代码,数据,父节点是最终被渲染到屏幕上唯一的。

<% forum.descendants.arrange(:order => :display_order).map do |forum,key| %> 
    <%= render :partial => 'forum', :locals => {:forum => forum} %> 
<% end %> 

我该如何渲染子节点?我知道他们可以通过“key”变量访问,但我不知道如何判断“key”变量是否具有可呈现的数据以及如何输出该数据。有什么建议么?

回答

1

您可以通过执行key.is_a?(Hash)来检查密钥是否为散列。

在你的例子中,它总是会计算为真,因为{}是一个空的散列。您可以检查哈希是否为空与key.empty?

要通过嵌套哈希迭代,你可以做递归这样的事情

def display hash 
    hash.each do |key, val| 
     # print key etc 
     if val.is_a?(Hash) 
      display val 
     else 
      # print value or whatever operation you want 
     end 
    end 
end