2013-10-04 139 views
2

我需要將Rails集合轉換爲嵌套的JSON。Rails集合嵌套JSON

收藏:

 

    [ 
     id: 2, name: "Dir 1", parent_id: nil, lft: 1, rgt: 6, depth: 0, 
     id: 3, name: "Dir 2", parent_id: nil, lft: 7, rgt: 8, depth: 0, 
     id: 9, name: "Dir 2.1", parent_id: 2, lft: 2, rgt: 3, depth: 1, 
     id: 10, name: "Dir 2.2", parent_id: 2, lft: 4, rgt: 5, depth: 1 
     ... 
    ] 

輸出JSON

 

    [ 
     { label: "Dir 1", children:[] }, 
     { label: "Dir 2", children: [ 
      label: "Dir 2.1", children: [], 
      label: "Dir 2.2", children: [] 
     ]} 
     ... 
    ] 

回答

3

這是假設你的收集綁定到一個模型,你'使用awesome_nested_set

class Model 

    def self.collection_to_json(collection = roots) 
    collection.inject([]) do |arr, model| 
     arr << { label: model.name, children: collection_to_json(model.children) } 
    end 
    end 

end 

# usage: Model.collection_to_json 

hereroots

上述的替代,因爲awesome_nested_set似乎產生於model.children疑問是:

class Model 

    def self.parents_from_collection 
    all.select { |k,v| k[:depth] == 0 } 
    end 

    def self.children_from_collection(parent) 
    all.select { |k,v| k[:parent_id] == parent[:id] } 
    end 

    def self.collection_to_json(collection = false) 
    collection ||= parents_from_collection 

    collection.inject([]) do |arr, row| 
     children = children_from_collection(row) 

     arr << { label: row[:name], children: collection_to_json(children) } 
    end 
    end 
end 
+0

我使用gem awesome_nested_set。這種方法會產生大量的請求?我有一棵大樹,我不能超載數據庫 – vmamaev

+1

我確實有一個功能替代。我想awesome_nested_set會急於加載到一定程度。不幸的是,我會更新替代方案。 –

+0

已更新。一定要更新'self.collection'來獲取所有的模型行。當然,修改你認爲合適的。重要的方法是'children_to_json'和'to_json'。 –

0

嘗試to_json方法

collection.to_json 
+0

他想轉換到不同的結構(注意'label','children'在他的輸出)。 –