JSON — вложение дочерних элементов RABL или JBuilder для Rails

У меня есть объекты, которые выглядят так:

[<ltree_val: "1", contents: "blah">, 
 <ltree_val: "1.1", contents: "blah">,
 <ltree_val: "1.1.1", contents: "blah">,
 <ltree_val: "2", contents: "blah">,
 <ltree_val: "2.1", contents: "blah">]

Где ltree_val определяет их древовидную структуру.

Мне нужно сгенерировать что-то вроде...

[{ "data" : "1",
  "children" : 
      [{ "data" : "1.1",
         "children" : 
              [{ "data" : "1.1.1" }]
       }]
  },
  { "data" : "2" }]

Где у меня есть дети, которые определяются значением ltree, которые сами являются элементами одного и того же объекта.

Если я отсортирую эти объекты по их значению в дереве, как я могу создать вложенные записи?

Я открыт либо для RABL, либо для JBuilder. Я совершенно потерян.


person robbiep    schedule 18.10.2013    source источник


Ответы (1)


Ответ заключался в использовании рекурсивной функции...

# encoding: UTF-8

def json_ltree_builder( json, ltree_item )
  json.title t( ltree_item.title )
  json.attr do
    json.id ltree_item.id
  end
  json.metadata do
      json.val1 ltree_item.val1
      json.val2 ltree_item.val2
    end
  children = ltree_item.children
  unless children.empty?
    json.children do
      json.array! children do |child|
        json_ltree_builder( json, child )
      end
    end
  end
end

json.array! @menu_items do |menu_item|
  json_ltree_builder( json, menu_item )
end

Это строит что-то вроде

[
  {  "title":"Title 1", 
    "attr" : {
      "id": 111
    },
    "data" : {
      "val1" : "Value 1",
      "val2" : "Value 2"
    },
    "children" : [
      {
        "title":"Child 1", 
        "attr" : {
          "id": 112
        },
        "data" : {
          "val1" : "Value 1",
          "val2" : "Value 2"
        }
      },
      {
        "title":"Child 2", 
        "attr" : {
          "id": 112
        },
        "data" : {
          "val1" : "Value 1",
          "val2" : "Value 2"
        }
      }
    ]
  }
]
person robbiep    schedule 14.03.2014
comment
В каком файле должна находиться рекурсивная функция? Это контроллер, частичный или помощник? - person MSC; 01.12.2014
comment
Аргумент json у меня не работает. Он сообщает о неправильном количестве аргументов (1 из 2). Вы заставили это работать? - person Khanetor; 17.03.2015