acts_as_tree和to_json或from_json

时间:2010-04-20 23:06:51

标签: ruby-on-rails

您好:有没有人有一个解决方案将acts_as_tree模型转换为包含其所有节点的json?我使用了:include =>:孩子,但这只能归结为一个单一级别。知道如何迭代整棵树吗?

2 个答案:

答案 0 :(得分:0)

您可以编写自己的方法来返回所有后代,但是这是您正在使用的树类型效率非常低的情况之一。

如果您担心性能和数据库命中,您应该查看其中一个嵌套集合宝石,或ancestry gem,它们是获取树分支的更有效方法。

答案 1 :(得分:0)

使用递归的帮助器(或私有方法)并将嵌套模型转换为嵌套哈希,然后使用to_json生成json字符串。

我需要在HTML / Erb视图中生成Json,但是如果您需要从控制器操作生成Json,或者使用Erb模板生成Json,则应该应用相同的想法。我还需要一个(硬编码的)根节点,如果不需要,可以跳过它。

categories.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