2012-08-09 3 views
0

실례합니다. Ruby를 처음 접했으나 프로그래밍이 아닙니다. 내 응용 프로그램에 계층 적 데이터를 저장하기 위해 Ancestry라는 보석을 사용하고 있습니다. 그들은 노드에서 모든 내림차순 자식, 손자 등의 중첩 된 해시를 반환하는 "자손"이라는 메서드를 가지고 있지만 각 노드를 반복하고 모든 자식 노드를 출력하는 데 어려움을 겪고 있습니다.중첩 된 해시를 걷는 데 도움이 필요합니다.

여기에 아래의 코드를 사용하여 해당 데이터를 통해 내가 루프, 부모 노드가 화면에 렌더링되는 끝낼 수있는 유일한 사람이있는 경우 데이터 구조가

{ 
    #<Forum id: 16, name: "Parent 1", ancestry: "7", display_order: 1> =>{}, 
    #<Forum id: 17, name: "Parent 2", ancestry: "7", display_order: 2> =>{}, 
    #<Forum id: 13, name: "Parent 3", ancestry: "7", display_order: 3> => 
    { 
    #<Forum id: 14, name: "Child 1", ancestry: "7/13", display_order: 1> =>{}, 
    #<Forum id: 15, name: "Child 2", ancestry: "7/13", display_order: 2> => 
    { 
     #<Forum id: 18, name: "Grand Child", ancestry: "7/13/15", display_order: 1> =>{}, 
    } 
    } 
} 

의 모습입니다.

<% forum.descendants.arrange(:order => :display_order).map do |forum,key| %> 
    <%= render :partial => 'forum', :locals => {:forum => forum} %> 
<% end %> 

어떻게 하위 노드를 렌더링 할 수 있습니까? 나는 그들이 "핵심"변수를 통해 액세스 할 수 있다는 것을 알고 있지만, "핵심"변수에 렌더링 할 수있는 데이터가 있고 그 데이터를 출력하는 방법을 알 수있는 방법을 모르겠습니다. 어떤 제안?

답변

1

key.is_a?(Hash)을 수행하면 키가 해시인지 확인할 수 있습니다.

예에서 {}은 빈 해시이기 때문에 항상 true로 평가됩니다. 당신은 해시 key.empty?

가 중첩 된 해시를 통해 반복과 비어 있는지 확인하실 수 있습니다,이

def display hash 
    hash.each do |key, val| 
     # print key etc 
     if val.is_a?(Hash) 
      display val 
     else 
      # print value or whatever operation you want 
     end 
    end 
end 
같은 재귀 적으로 뭔가를 할 수