Rails, создавая древовидную структуру.Вывод JSON - PullRequest
3 голосов
/ 08 апреля 2011

у меня есть таблица данных, которая может иметь друг друга как родителей или детей, она обрабатывается полем parent_id (я использую gem act_as_tree)

элементы первого уровня имеют 0 как parent_id

там может быть бесконечное количество детей.Я хочу вывести как JSON.окончательный результат должен быть примерно таким:

{
   "feild1": "dd",
   "filed2": "ee",
   "child" : {
       "feild1": "dd",
        "filed2": "ee",
        } 
   "child" : {
        "feild1": "dd",
        "filed2": "ee",
                 "child" : {
                      "feild1": "dd",
                      "filed2": "ee",
                  } 
        } 

}

. До сих пор у меня все, что у меня есть, это

def coa_tree
   @roots = Coa.find(:all, :conditions => ['parent_id = ?', 0])
   @response = @roots

   @roots.each do |root|
     logger.debug "roots each"
      output = root
      root.children.each do |child|
           output = {:child => output, :child => child}

      end

   end
   respond_with(@response)
end

, очевидно, я даже близко не подошел к решению проблемы.Если бы кто-то мог указать мне правильное направление, я был бы очень признателен.возможно есть плагин, о котором я не знаю, который помог бы мне решить это.спасибо.

Ответы [ 2 ]

13 голосов
/ 08 апреля 2011

Ваш пример JSON недопустим, поскольку в одном и том же объекте есть несколько ключей с одним и тем же именем, но вывод структуры дерева в виде JSON из объекта ActiveRecord определенно возможен.

Попробуйте добавить такой метод в класс вашей модели:

class Coa < ActiveRecord::Base
  def to_node
    { "attributes" => self.attributes,
      "children"   => self.children.map { |c| c.to_node }
    }
  end
end

Теперь вы можете получить все дерево в формате JSON, используя:

root = Coa.find(:first, :conditions => ["parent_id = ?", 0])
root.to_node.to_json
4 голосов
/ 31 декабря 2012

Единственное, что я хотел бы добавить к ответу Тодда Янделла, это то, что может быть полезно не иметь отдельных ключей для «атрибутов» и «детей». Другими словами, в то время как метод Янделла будет возвращать данные, подобные этому:

{
   "attributes" : {
        "field1": "dd",
        "field2": "ee",
   "children" : [{
        "field1": "dd",
        "field2": "ee",
    }, {
        "field1": "dd",
        "field2": "ee",
    }, {
        "field1": "dd",
        "field2": "ee",
    }]
}

Вы можете пожелать, чтобы данные в вопросе выше были отформатированы следующим образом:

{
   "field1": "dd",
   "field2": "ee",
   "children" : [{
        "field1": "dd",
        "field2": "ee",
    }, {
        "field1": "dd",
        "field2": "ee",
    }, {
        "field1": "dd",
        "field2": "ee",
    }]
}

Этот формат особенно полезен в ситуациях, когда код на стороне клиента ожидает данные JSON в формате дерева и не позволяет гибко определять различные ключи для родительских атрибутов и дочерних элементов (например, компонент NestedList в Sencha Touch и т. Д.).

Чтобы достичь этого, основываясь на концепции Янделла, я придумал следующее:

def to_node
  self.attributes.merge({:children => self.children.map { |c| c.to_node }})
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...