actions_as_tree и to_json или from_json - PullRequest
       14

actions_as_tree и to_json или from_json

0 голосов
/ 21 апреля 2010

Здравствуйте. У кого-нибудь есть решение для преобразования модели acts_as_tree в json, включающее все его узлы? Я действительно использовал: include =>: children, но это сводится только к одному уровню. Есть идеи, как перебрать все дерево?

Ответы [ 2 ]

0 голосов
/ 26 августа 2011

Используйте вспомогательный (или закрытый метод), который является рекурсивным и превращает ваши вложенные модели во вложенный хеш, затем используйте to_json для генерации строки json.

Мне нужно было генерировать Json в HTML/ Представление Erb, но та же идея должна применяться, если вам нужно сгенерировать его из действия контроллера или использовать шаблон Erb для генерации Json.Мне также был нужен (жестко закодированный) корневой узел, который можно пропустить, если он не требуется.

category.html.erb

<script type="text/javascript">
  $(function(){
      var json = {
        id: "node00",
        name: "New Pathway",
        data: {},
        children: 
<%= @categories.select { |c| c.root? && !c.leaf? }.collect { |c| category_to_spacetree_json(c) }.to_json.html_safe %>
      };

      init(json);
  });
</script>

Categories_helper.rb

  def category_to_spacetree_json(category)
    hash = {
      :id => category.id,
      :name => category.name,
      :data => '',
      :children => []
    }

    unless category.leaf?
      hash[:children] = category.children.public.collect { |c| category_to_spacetree_json(c) }
    end

    hash        
  end
0 голосов
/ 21 апреля 2010

Вы можете написать свой собственный метод, который возвращает всех потомков, однако это один из тех случаев, когда тип дерева, который вы используете, будет довольно неэффективным.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...