2013-02-05 92 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