Ruby 从模型关系创建未知深度的数组

Ruby 从模型关系创建未知深度的数组,ruby,Ruby,所以这似乎是一个简单的问题,但我正在努力寻找解决方案 我有一个页面列表,有些页面有子页面,有些子页面有自己的子页面。我想创建一种按照子页面的顺序列出所有页面的方法 我的目标是: page_1 page_1a page_2 page_2a page_2b page_2bi page_2bii page_2biii page_2c page_3 page_4 page_5 (我正在寻找的实际输出是一个数组,我可以在视图中这样打印出来) 如果我使用嵌套的每个语

所以这似乎是一个简单的问题,但我正在努力寻找解决方案

我有一个页面列表,有些页面有子页面,有些子页面有自己的子页面。我想创建一种按照子页面的顺序列出所有页面的方法

我的目标是:

page_1
  page_1a
page_2
  page_2a
  page_2b
    page_2bi
    page_2bii
    page_2biii
  page_2c
page_3
page_4
page_5
(我正在寻找的实际输出是一个数组,我可以在视图中这样打印出来)

如果我使用嵌套的
每个
语句,这将是非常容易的,但是我想要一些关于嵌套深度的不可知的东西。我需要的东西,可以产生正确的输出,无论有多少层嵌套

我已经找到了解决这个问题的方法,并给出了下面的代码。这段代码的问题是,一旦嵌套,它就找不到嵌套页面父级的其余同级-换句话说,它在找到嵌套页面后停止并移动到下一个顶级页面

def打印页面层次结构
输出=[]
Page.top_level.each do|p|
级别=0
保持循环=真

输出准备一些输入。我假设您有一个节点数组,每个节点都有一个名称和子节点:

class Node < Struct.new(:name, :children); end
nodes = [ Node.new(:page_1, [ Node.new(:page_1a) ]),
          Node.new(:page_2, [ Node.new(:page_2a),
                              Node.new(:page_2b, [ Node.new(:page_2bi),
                                                   Node.new(:page_2bii),
                                                   Node.new(:page_2biii) ]),
                              Node.new(:page_2c) ]),
          Node.new(:page_3),
          Node.new(:page_4),
          Node.new(:page_5) ]
试验


我可以给你一个用这种逻辑构建xml的好主意。这是一个应该用递归函数解决的问题的完美例子:一个函数返回当前级别的节点加上下面级别的相同函数的结果。想试试吗,或者你需要更多的帮助。顺便说一句,这方面有很多技巧,例如,
awesome\u nested\u set
。您显示了所需的输出,但没有显示它的结构。@spickermann我正在尝试理解如何解决这个问题,而不是使用gem,但感谢您的建议。如果您能为这个问题提供一个递归函数的小例子,那就太好了。我理解这个概念,但不知道如何应用它。@sawa和Arup-Rakshit——我不太关心输出的细节,只是它是一个数组(不是xml)。我的示例有效地显示了具有不同缩进级别的平面数组。如何做比细节更重要。如此简单-完美的答案。谢谢
def print_page_hierarchy(nodes, indent = 0)
  return unless nodes   # stops the recursion if there are no nodes

  nodes.each do |node|
    puts "#{'  ' * indent}#{node.name}"
    # here is the list of all children generated, do not care about how
    # deep the subtree is, cause recursion...
    print_page_hierarchy(node.children, indent + 1)
  end
end
print_page_hierarchy(nodes)
# => page_1
#      page_1a
#    page_2
#      page_2a
#      page_2b
#        page_2bi
#        page_2bii
#        page_2biii
#      page_2c
#    page_3
#    page_4
#    page_5