简单的递归方法

时间:2013-06-28 11:05:59

标签: ruby-on-rails ruby

我有Board模型。董事会可以订阅其他董事会(作为馈送)。 让我们说我有这样的董事会树:

http://upload.wikimedia.org/wikipedia/commons/thumb/f/f7/Binary_tree.svg/200px-Binary_tree.svg.png

所以: Board.find(2).feeds是第5和第7板 Board.find(7).feeds是第2和第6板等。

我想编写方法all_feeds,它返回某些主板的所有级别的所有Feed。例如: Board.find(7).all_feeds会输出带有ID的板数组:2,6,5,11

我开始使用类似的东西:

  def all_feeds
    if feeds.empty?
      return
    else
      feeds.each {|feed| feed.all_feeds}
      return feeds
    end
  end

可能必须将此返回提要添加到某个全局数组,但不确定应该如何执行此操作。

感谢您的帮助。

PS。这并不总是二叉树,您可以有两个以上的Feed。

3 个答案:

答案 0 :(得分:1)

我猜你想要的东西可以通过以下方式实现:

def all_feeds
  unless feeds.empty?
    feeds + feeds.map(&:all_feeds).flatten.compact
  end
end

Array#flatten将结果设为一维,而Array#compact则删除零组件。

有关map(&:all_feeds)部分的说明,请参阅this SO answer:)

答案 1 :(得分:1)

看起来它适用于以下代码:

 def all_feeds
    if feeds.empty?
      self
    else
      [self]+feeds.map(&:all_feeds)
    end
  end

答案 2 :(得分:0)

如果允许使用gems ancestry gem将有助于实现技巧

Board.find(7).descendants

在这种情况下,它绝对是对db的一个请求,没有任何递归,这对性能更好

你可以实现没有宝石的祖先理念(或者在它的顶部):

  • ancestry字段添加到您的模型

  • 在构建树时正确填充(对于带有ID 2和6的嵌套节点,它将为2/7,带有ID 5和11 - 2/7/6

  • 然后只需使用like 2/%查询

  • 从db中获取它