2009-08-25 4 views
0

내 웹 사이트 구조에 awesome_nested_set을 사용하고 있습니다. 중첩 된 집합의 UL/LI 기반 인덱스 막대를 만들 수 있지만 중첩 된 집합의 낮은 데이터베이스 집중도를 활용하기를 원합니다. acts_as_tree를 사용할 때 인덱스 바를 만드는 재귀 함수가있었습니다. 그것은 어떤 어린이 등 발생할 경우 그냥 자체라고 ... nested_set 함께 할 더 좋은 방법이 궁금하네요. 나는 지금까지 (테스트되지 않은) 다음과 같이 왔어요 : http://dev.rubyonrails.org/ticket/9678 :재귀 적으로 인덱스 막대 만들기 (UL, LI 기반)

def recursive_indexbar(parent, parameters) 
    return unless parameters.length == 1 && parameters.first.to_i > 0 

    maximum_level = parent.level + parameters.first 

    content_tag :ul do 
     parent.descendants.current.visible.front_end.recurse do |component_instance, block| 
     content_tag :li, :class => (@item.component_instance == component_instance) ? 'uber' : false do 
      component_instance.name 
      unless component_instance.leaf? 
      content_tag :ul, block.call 
      end 
     end 
     end 
    end 
    end 

을 nested_set에는 같이 Recurse 기능이 없기 때문에 지금은 실제로 작동하지 않습니다, 난 그냥이 링크에서 그것을 집어 들었다. 페이지의 마지막 코멘트를보십시오.

너무 많은 수준으로 깊숙이 들어갈 수있는 기능이 있지만 구현하기 쉽습니다.

아무도 내게 어떤 포인터를 줄 수 있습니까?

답변

1

그럼 대답 해 드리겠습니다. 기본적으로 람다와 반환 함수를 사용하여 콘텐츠가 포함 된 중첩 배열을 만드는 데 도움이되었습니다. 그런 다음 뷰를 스트레이트 텍스트로 디 컴파일합니다.

def new_recursive(parent, parameters) 
    return unless parameters.length == 1 && parameters.first.to_i > 0 

    maximum_level = parent.level + parameters.first 

    recurse = lambda do |component_instance| 
     component_instance.children.current.visible.front_end.collect do |child| 
     content_tag :li, :class => (@item.component_instance == child ? 'uber' : nil) do 
      returning [] do |content| 
      content << link_to(child.name, [child.parent, child.instance]) 
      unless child.leaf? || child.level == maximum_level 
       content << content_tag(:ul, recurse.call(child)) 
      end 
      end 
     end 
     end 
    end 

    content_tag :ul, recurse.call(parent) 
    end 

또한 각 (보다 논리적 인 것처럼 보임)을 사용합니다. Collect는 우리가 원하는 배열을 반환합니다. 원래 배열 내에서 추가 또는 중첩을 중단하면 모든 것이 무너집니다.

앞으로 도움이되기를 바랍니다. 내 용도에는 맞게 꾸며졌지만 모든 트리 구조로 전송됩니다. 중첩 된 집합으로 효율적으로 작업하게하는 것은 멋지지만 인덱스 바는 일반적으로 한 두 단계만으로 재귀가 제어 할 수 없기 때문에 좋습니다.

관련 문제