祖先宝石“扁平的树”

时间:2013-02-05 05:36:24

标签: ruby-on-rails ruby algorithm tree ancestry

我整天都在反对这一个。新眼睛的时间。

我有一个使用祖先宝石的树状结构模型。效果很好,调用TreeNode.arrange会返回一个整齐的小哈希,这是一个嵌套的树。问题是因为缺乏更好的描述,我正在寻找一个“扁平的树”。例如:

Node1
Node2
Node3
  Node4
  Node5
  Node6
    Node7
    Node8
Node9

与传统的

相反
Node1
  Node2
   Node3...

所以换句话说,如果有一个分支点(多个孩子),我只想“缩进”我的树。我认为最好的方法是递归函数。我尝试了几种变体,我只想在这一个上画一个空白: - \

def walk_until_fork(tree_hash,&blk)
   tree_hash.each do |node,children| 
    yield node.title
    if children.keys.length > 1
      #fork point
      children.each do |subnode,grandchilden|
        walk_until_fork(grandchilden,&blk)
        yield subnode.title       
      end
    else
      walk_until_fork(children,&blk)
    end
  end
end

调用该测试代码的结果是叉点最终位于输出的底部: - \

我真正希望看到的是这样的哈希结构,但是应该有孩子的唯一键是分支发生的地方(一个分支在当前级别继续,每个分支在该分支之后)。

我不确定我是否清楚。如果需要,我会澄清任何问题。

2 个答案:

答案 0 :(得分:0)

删除了我用新方法重新启动的所有内容。我以后最有可能重构这个,但这里是基本的想法。

def walk_until_fork(tree_hash, root_node = nil)
  root_node ||= ActiveSupport::OrderedHash.new
  tree_hash.each do |node,children|
    more_than_one = false
    parent_node = root_node[node] = ActiveSupport::OrderedHash.new
    children.each do |k,v|
      fork_node = more_than_one ? parent_node : root_node
      walk_until_fork({k => v},fork_node)
      more_than_one = true
    end
  end
  root_node
end

然后我打电话给:

walk_until_fork(self.arrange)

代码将哈希引用传递给当前根,将其更改为新哈希,只有多个子进程。

答案 1 :(得分:-1)

您可以在CSS中指定要将其限制为多少级别的嵌套。要将它限制为3级,因为您表明CSS中有以下内容。

.nested_messages {
      margin-left: 30px;
    }

    .nested_messages .nested_messages .nested_messages .nested_messages{
      margin-left: 0;
    }

在上面的CSS中,你只能缩进3个级别(在页面中使用相关代码。在3个级别的项目不再缩进。我只是在这里显示CSS,你需要在视图中添加其他代码。

Ryan Bates在此Railscast中介绍了这一点,并提供了完整的代码示例。你应该能够一步一步地完成它。

http://railscasts.com/episodes/262-trees-with-ancestry