模型中的简单递归方法

时间:2012-11-23 11:57:59

标签: ruby-on-rails ruby

我正在尝试编写非常简单的递归方法,但无法使其工作。 我有简单的评论层次结构,其中包含ID:

1--
   2--
      4--
   3--
      5--

现在我想将它们的ID保存在数组(树顺序)[0]=1, [1]=2, [2]=4, [3]=3, [4]=5

我开始使用

在Entry模型中构建此数组
def comment_tree
  comment = self.comments.find(1) #it's temporary, just to check if it works
  return recur(comment,0)
end

private
def recur(comment,i)
  @tree[i]=comment.id #added attr_accessible :@tree
  if comment.children.any?
    comment.children.each {|c| recur(c,i+1)}
  else
    return
  end
  @tree
end

这不起作用,因为块运行两次相同的计数器参数recur(4,2)recur(3,2)。我需要类似全局$ i的东西来保持这个arras索引,但我确信必须有更好的方法来做到这一点。与@tree相同,我是否真的必须将新变量添加到模型中才能将其用作recur方法的返回参数?我不会在任何其他地方使用它。

1 个答案:

答案 0 :(得分:2)

这个怎么样:

def comment_tree
  comment = self.comments.find(1)
  tree = []
  recur(comment, tree)
  tree
end

private
def recur(comment, acc)
  acc << comment.id
  comment.children.each {|c| recur(c, acc) }
end