2011-05-09 2 views
3

내가 문서에 중첩 된 주석 트리있어 mongoid와 중첩 된 트리를 표시하고 레일 :효율적인 방법은 다음과 같이 embeds_many_recursively mongoid를 사용하여,

가보기에 전달하는 가장 효과적인 방법은 무엇입니까
Document: { 
    ... 
    comments: [{ 
     ... 
     updated_at, 
     child_comments: [{ 
     ... 
     updated_at 
     child_comments: [{...},{...}], 
     ...},{...}] 
     ...}] 
    ...}] 
    ...} 

첫 번째 수준 'comment updated_at'속성에 의해 정렬되는 방식으로?

def flatten_comments 
    @flat_comments = [] 
    self.comments.order_by([[:updated_at, :desc]]).each do |comment| 
     flatten_comments_iterator(comment) 
    end 
    return @flat_comments 
    end 

    def flatten_comments_iterator(comment) 
    @flat_comments << comment 
    comment.child_comments.each {|reply| flatten_comments_iterator(reply)} 
    end 

하고 단지 배열을 통해보기에 반복 : 나는 주 문서 모델 안에이 함께했다 순간

.

문제는 다음과 같습니다. 1) 재귀 적 평면화에서 순서가 어딘가에서 손실되어 어디서나 필요한 순서로 항목을 추가하는 것처럼 보입니다. 클래스 변수 범위 및 액세스와 관련이 있습니다.

2) 간단한 검색을하는 것이 가장 효율적인 방법인지 잘 모르겠습니다.

이러한 종류의 작업을 효율적으로 처리하는 방법에 대한 조언과 경험에 감사드립니다.

답변

2

ruby driver's modeling examples에 문서화되어있는 기본적으로 2 가지 설계 방법이 있습니다 (그 중 하나는 귀하의 것과 동일합니다). 비슷한 약 question on SO도 있습니다.

다른 문제 : 일반적으로 댓글에 엄청난 중첩이없는 경우 재귀에 대해 나쁜 점은 없습니다. 그러나 인스턴스 변수를 사용하고 로컬 변수를 사용하지 않으므로 구현은 스레드로부터 안전하지 않습니다. 이 문제를 해결하려면 @flat_comments을 로컬 변수로 변환하고 flatten_comments_iterator 메서드에 매개 변수로 전달해야합니다.

팁 : method recursion can be transformed to a iteration이므로 구현하고자하는 것은 그래프의 iterative preorder traversal입니다.