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