2017-03-31 4 views
1

누구든지 트리 구조를 표시하는 데 도움이됩니다. "Element"라는 단일 테이블간에 부모 자식 연결을 만들었습니다. 또한 항목이 적절한 방식으로 저장됩니다.Ruby on rail의 트리 구조 표시

코드를 작성했지만 수준에서 작동합니다. 최적화 할 루프를 사용했기 때문에 빠른 솔루션을 사용할 수있는 코드가 필요합니다.

class Element 
    include Mongoid::Document 
    validates :name, presence: true 

    field :name, type: String 
    field :description, type: String 
    field :top, type: String 

    has_many :media_files 

    has_and_belongs_to_many :parents, :class_name => 'Element' 
    has_and_belongs_to_many :childrens, :class_name => 'Element' 

    def self.js_tree 
    json_data = Array.new 
    elements = Element.where(top: "true") 
    get_inner_elements elements, json_data 
    return json_data.uniq {|e| e[:id] }.to_json 
    end 

    def self.get_inner_elements elements, json_data 
    elements.each do |element| 
     single_element element, json_data 
     element.childrens.each do |inner_element_one| 
     single_element inner_element_one, json_data, element.id 
     inner_element_one.childrens.each do |inner_element_two| 
      single_element inner_element_two, json_data, inner_element_one.id 
      inner_element_two.childrens.each do |inner_element_three| 
      single_element inner_element_three, json_data, inner_element_two.id 
      inner_element_three.childrens.each do |inner_element_four| 
       single_element inner_element_four, json_data, inner_element_three.id 
      end 
      end 
     end 
     end 
    end 
    return json_data 
    end 

    def self.single_element element, json_data, parent=nil 
    json_data << { 
     :id  => "#{element.id}", 
     :parent => "#{parent.nil? ? '#' : parent}", 
     :a_attr=> { class: "foldor-icon" }, 
     :text => "#{element.name}" 
     } 
     element.media_files.each do |mf| 
     json_data << { 
      :id  => "file_#{element.id}_#{mf.id}", 
      :parent => "#{element.id}", 
      :text => mf.file_filename, 
      :icon  => mf.icon, 
     } 
     end 
    return json_data 
    end 

end 

프런트 엔드는 :

<script type="text/javascript"> 
    data = $.parseJSON('<%= raw Element.js_tree %>') 
    $('#container').jstree({ 
    'core' : { 
     'data' : data 
    } 
    }); 
</script> 

get_inner_elements 사람은 그 적용 드릴 수 없습니다 사용하는 것을 재귀 필요가 있음을 수행하는 방법을 제안 해주십시오 최적화 될 필요가있다.

Thannks

답변

1

재귀 알고리즘을 사용해보십시오.

def self.get_inner_elements(elements, json_data) 
    elements.each do |element| 
     if elements.children.count > 0 
      single_element(element, json_data, element.parent?) 
      get_inner_elements(element.children, json_data) 
     else 
      single_element(element, json_data, element.parent?) 
     end 
    end 
    json_data 
end 

완벽하게 최적화되지는 않았지만 큰 나무보다 약간 읽을 수 있습니다.

하나의주의 사항은 요소의 동일한 순서가 보존되지 않는다는 것입니다. 요구 사항 중 하나가 아닌 경우 쉽게 사용할 수 있습니다. 그렇지 않으면 쉽게 사용할 수 있습니다. json_data을 가지고 다시 주문해야합니다. 출력