2015-04-23 53 views
2

我有一個自我指涉的模型,生成嵌套層次響應從軌自我指涉協會

class Hierarchy < ActiveRecord::Base 
    has_many :children, :class_name => "Hierarchy", :foreign_key => 'parent_id' 

    def descendents 
    children.map do |child| 
     [child] + child.descendents 
    end 
    end 
end 

如何構建從模型「層次」這樣的層次樹,

{ 
    "hierarchies": [ 
    { 
     "level": 1, "id": 14951, "name": "EQUIPMENT", "parent_id": null, 
     "children": [ 
     { 
      "level": 2, "id": 15040, "name": "BASKETBALL", "parent_id": 14951, 
      "children": [ 
      { 
       "level": 3, "id": 15154, "name": "EYEWEAR", "parent_id": 15040, 
       "children": [ 
       { 
        "level": 4, "id": 16617, "name": "OPHTHALMIC", "parent_id": 15154, 
        "children": [] 
       } 
       ] 
      }, 
      { 
       "level": 3, "id": 16417, "name": "OTHER", "parent_id": 15040, "children": [] 
      } 
      ] 
     } 
     ] 
    } 
    ] 
} 

「層次結構」模型的descendents方法可以迭代和檢索Herarchy模型中的數據直到最後一層。

例子:

render :json => { :hierarchies => [root_hierarchy, root_hierarchy.descendents]} 

它返回所有的水平,

{ 
    "hierarchies": [ 
    { 
     "level": 1, "id": 14951, "name": "EQUIPMENT", "parent_id": null 
    }, 
    [ 
     [ 
     { 
      "level": 2, "id": 15040, "name": "BASKETBALL", "parent_id": 14951 
     }, 
     [ 
      { 
      "level": 3, "id": 15154, "name": "EYEWEAR", "parent_id": 15040 
      }, 
      [ 
      { 
       "level": 4, "id": 16617, "name": "OPHTHALMIC", "parent_id": 15154 
      } 
      ] 
     ], 
     [ 
      { 
      "level": 3, "id": 16417, "name": "OTHER", "parent_id": 15040 
      } 
     ] 
     ] 
    ] 
    ] 
} 

的問題是我不能在每次迭代中追加其相關的兒童。 我試過as_jsonincludes方法來追加子對象的父對象,但沒有運氣。

回答

0

我以前有過同樣的問題。我建議你看看closure_tree。它增加了一些非常有用的方法來操作分層數據。它有一種抓取只需要1個SELECT查詢的後代的方法。使用鄰接列表的當前實現很簡單,但它需要每個後代都有一個查詢,並且很快變得效率低下。