在Ruby中对嵌套/邻接模型进行排序的算法

时间:2010-02-09 15:25:28

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

我一直试图找到一种很好的方法,无论是在Javascript的客户端还是在服务器的最后一刻。这是一个Rails应用程序,但它是一个非常通用的问题。我有一个分层的模型,目前存储在嵌套集模型中。该模型然后:

parent_id, lft, and rgt

我想从数据库中提取一个select语句中的所有模型,因此给我一个平面的模型列表,然后将它们即时排序到树层次结构中。我没有找到一个干净的方法来做这个不需要递归。我确信那里有一个很好的算法。感谢。

1 个答案:

答案 0 :(得分:0)

我不知道没有递归的算法。以为我会分享我的站点地图视图助手:

def tree_from_set(set, &node_text)
  buf = '<ul>'
  siblings = set.select{|n| n.parent_id == set[0].parent_id}

  siblings.each do |node|
    children = set.select{|n| n.lft > node.lft and n.rgt < node.rgt }
    buf << '<li>'
      if children.blank?
        buf << yield(node)
      else
        buf << yield(node)
        buf << tree_from_set(children, &node_text)
      end
    buf << '</li>'
  end
  buf << '</ul>'
end