2013-02-05 52 views
0

我一直对着这一天一直打着头。时间新眼睛。祖先的宝石“扁平的树”

我有一个使用祖先宝石的树型结构模型。很好的工作,并呼吁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

请解释UR节点(1-9 )再次...在节点1或节点2处的节点2处于同一级别是1级别低节点1。和Node3和Node4中的级别差异 –

+0

节点是真正的节点Node1有一个Node2的子节点,Node2有一个Node3的子节点等等......但是我想“扁平化”节点树,这样如果只有一个父节点的孩子不需要分支。希望这可以帮助。我回答了我自己的问题,但也许别人会有更好的主意。 – Kansha

回答

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

您可以指定要将其限制在CSS中的嵌套层数。要将其限制为3个级别,则表示您的CSS中包含以下内容。

.nested_messages { 
     margin-left: 30px; 
    } 

    .nested_messages .nested_messages .nested_messages .nested_messages{ 
     margin-left: 0; 
    } 

在这上面的CSS你只能缩进3级(在你的页面的关联的代码。后3名级别的项目不再缩进。我只是在这里展示的CSS,你需要额外的代码在

你的意见。

瑞恩·贝茨介绍这个在这个Railscast并具有完整的代码示例,你应该能够走过一步一步来。

http://railscasts.com/episodes/262-trees-with-ancestry

+0

CSS在我所问的问题上如何相关? – Kansha