【问题标题】:Ancestry gem "flattened tree"祖传宝石“扁平树”
【发布时间】:2013-02-06 04:27:48
【问题描述】:

我一整天都在反对这个。是时候换眼了。

我有一个使用祖先 gem 的树结构模型。效果很好,调用 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

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

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

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

【问题讨论】:

  • 请再次解释你的节点(1-9)... node2 是在 node1 的同一级别还是 node2 在 node1 以下 1 级别。?以及 Node3 和 Node4 中的级别差异
  • 节点是真正的节点 Node1 有 Node2 的子节点,Node2 有 Node3 的子节点,等等...但是我想“展平”节点树,以便如果只有一个子节点父节点不需要分支。希望这可以帮助。我回答了我自己的问题,但也许其他人会有更好的主意。

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


【解决方案1】:

我删除了所有内容并重新开始使用新方法。稍后我很可能会对其进行重构,但这是基本思想。

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)

代码将散列引用传递给当前根,将其更改为新散列,仅存在多个子节点。

【讨论】:

    【解决方案2】:

    您可以在 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

    【讨论】:

    • CSS 与我所问的有什么关系?
    猜你喜欢
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多