2013-02-05 2 views
0

나는 하루 종일 머리에 맞았다. 새로운 눈의 시간.Ancestry gem "평평한 나무"

저는 조상 보석을 사용한 나무 구조 모델을 가지고 있습니다. 위대한 작품과 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 

포크 점 출력의 하단 끝입니다 테스트 코드를 호출의 결과 : - \

내가보기를 원하는 것은 해시 구조입니다.하지만 자식이 있어야하는 유일한 키는 분기가 일어난 곳입니다 (하나의 분기가 현재 수준에서 계속되고 각 n 분기가 해당 분기 후에 계속됩니다).

확실한 지 확실하지 않습니다. 필요한 경우 질문을 명확히하겠습니다.

+0

는 (1-9 UR 노드를 설명해주십시오) 다시 ... node2는 node1과 같은 레벨에 있거나 node2는 1 레벨이됩니까? 낮은 노드 1.? 노드 3과 노드 4의 레벨 차이 –

+0

노드는 참 노드입니다. 노드 1에는 노드 2의 하위 노드가 있고 노드 2에는 노드 3의 하위 노드가 있습니다.하지만 노드 트리를 "평평하게"하여 원하는 경우에만 하나의 자식 노드는 분기가 필요 없습니다. 희망이 도움이됩니다. 나는 내 자신의 질문에 대답했지만 다른 누군가는 더 좋은 생각을 가지고있을 것이다. – Kansha

답변

0

모든 것을 삭제하고 새로운 접근 방식으로 시작했습니다. 나는 이것을 가장 나중에 좋아할 것이지만 여기서 리팩토링 할 것이다. 그러나 기본적인 생각이 여기에있다. 이 코드는 두 개 이상의 자녀가 새로운 해시로 변경, 현재의 루트에 주위 해시 참조를 전달

walk_until_fork(self.arrange) 

:와

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 

그럼 난 그냥 전화.

-1

CSS에서 제한 할 중첩 수준을 지정할 수 있습니다. 3 레벨로 제한하려면 CSS에서 다음을 수행해야합니다. 더 이상 들여 3 개 단계 항목 후. 페이지에서 관련 코드 (3 개 수준을 들여 쓰기에만 수있어 이상이 CSS에서

.nested_messages { 
     margin-left: 30px; 
    } 

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

. 난 그냥 여기에 CSS를 보여주는거야, 당신은 추가 코드가 필요 귀하의 의견에.

라이언 베이츠는이 Railscast이를 커버하고 전체 코드 예제가 있습니다. 당신은 그것을 단계적으로를 통해 걸을 수 있어야한다.

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

+0

내가 뭘 물었을 때 CSS가 AT ALL과 어떤 관련이 있습니까? – Kansha