我整天都在反对这一个。新眼睛的时间。
我有一个使用祖先宝石的树状结构模型。效果很好,调用TreeNode.arrange
会返回一个整齐的小哈希,这是一个嵌套的树。问题是因为缺乏更好的描述,我正在寻找一个“扁平的树”。例如:
Node1
Node2
Node3
Node4
Node5
Node6
Node7
Node8
Node9
与传统的
相反Node1
Node2
Node3...
所以换句话说,如果有一个分支点(多个孩子),我只想“缩进”我的树。我认为最好的方法是递归函数。我尝试了几种变体,我只想在这一个上画一个空白: - \
def walk_until_fork(tree_hash,&blk)
tree_hash.each do |node,children|
yield node.title
if children.keys.length > 1
#fork point
children.each do |subnode,grandchilden|
walk_until_fork(grandchilden,&blk)
yield subnode.title
end
else
walk_until_fork(children,&blk)
end
end
end
调用该测试代码的结果是叉点最终位于输出的底部: - \
我真正希望看到的是这样的哈希结构,但是应该有孩子的唯一键是分支发生的地方(一个分支在当前级别继续,每个分支在该分支之后)。
我不确定我是否清楚。如果需要,我会澄清任何问题。
答案 0 :(得分:0)
删除了我用新方法重新启动的所有内容。我以后最有可能重构这个,但这里是基本的想法。
def walk_until_fork(tree_hash, root_node = nil)
root_node ||= ActiveSupport::OrderedHash.new
tree_hash.each do |node,children|
more_than_one = false
parent_node = root_node[node] = ActiveSupport::OrderedHash.new
children.each do |k,v|
fork_node = more_than_one ? parent_node : root_node
walk_until_fork({k => v},fork_node)
more_than_one = true
end
end
root_node
end
然后我打电话给:
walk_until_fork(self.arrange)
代码将哈希引用传递给当前根,将其更改为新哈希,只有多个子进程。
答案 1 :(得分:-1)
您可以在CSS中指定要将其限制为多少级别的嵌套。要将它限制为3级,因为您表明CSS中有以下内容。
.nested_messages {
margin-left: 30px;
}
.nested_messages .nested_messages .nested_messages .nested_messages{
margin-left: 0;
}
在上面的CSS中,你只能缩进3个级别(在页面中使用相关代码。在3个级别的项目不再缩进。我只是在这里显示CSS,你需要在视图中添加其他代码。
Ryan Bates在此Railscast中介绍了这一点,并提供了完整的代码示例。你应该能够一步一步地完成它。