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