2009-05-15 3 views
0

레일즈 애플리케이션에서 "acts_as_nested_set"을 사용하고 있습니다. (멋진 중첩 세트 플러그인으로 확장). 각 요소가 복제본을 가져 오지만 관계 구조가 원본 요소를 모방하도록 요소 및 해당 전체 중첩 세트를 복제하는 함수/메서드를 작성하는 가장 좋은 방법을 논리적으로 시도했습니다.루트 요소의 전체 중첩 세트를 새 트리로 복사/복제하는 방법

중첩 된 세트를 사용하면 위치 열을 얻습니다. 대신 position_id이 사용됩니다.

각 세트의 맨 아래 (노드가없는 노드)부터 시작하여 부모를 통해 새 루트까지 복제해야합니까?

이 작업은 이미 완료되었거나 중첩 된 설정을 위해이 작업을 수행하는 방법이있는 것처럼 보이지만 나에게 안내 할만한 것을 찾을 수 없습니다.

고마워요.

답변

1

나는 acts-as-tree로 이런 일을했습니다. 나는 집단 집합을 반복하고 각 항목을 복제했다. 원본과 복제 된 항목을 소스가 키이고 복제본이 대상인 해시에 저장했습니다. 그런 다음 부모 참조와 함께 해시를 사용하여 관계를 확인하고 다시 매핑했습니다.

다음은 요지를 전달하는 데 도움이되는 미리보기입니다.

clone 메서드는 단순히 id가없는 새 복사본을 인스턴스화합니다. descendants 메소드는 직접적인 것뿐만 아니라 모든 자손의리스트를 리턴합니다.

def clone_branch() 
    h = {self => self.clone} #we start at the root 

    ordered = self.descendants #preserved order with acts_as_sortable 

    #clone subitems 
    ordered.each do |item| 
    h[item] = item.clone 
    end 

    #resolve relations 
    ordered.each do |item| 
    cloned = h[item] 
    item_parent = h[item.parent] 
    item_parent.children << cloned if item_parent 
    end 

    h[self] 
end 
관련 문제