2

我有板模型。板可以订阅其他板(作为提要)。假设我有这样的板树:

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,该方法返回某个板的所有级别的所有提要。例如: 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

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

感谢帮助。

附言。这并不总是二叉树,您可以有超过 2 个提要。

4

3 回答 3

1

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

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

Array#flatten使结果一维,而Array#compact删除 nil 组件。

有关该map(&:all_feeds)部分的说明,您可以参考这个 SO 答案:)

于 2013-06-28T11:18:32.623 回答
1

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

 def all_feeds
    if feeds.empty?
      self
    else
      [self]+feeds.map(&:all_feeds)
    end
  end
于 2013-06-28T11:47:46.987 回答
0

如果允许使用宝石祖先宝石将有助于解决问题

Board.find(7).descendants

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

您可以在没有 gem(或在其之上)的情况下实现祖先的想法:

  • ancestry字段添加到您的模型

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

  • 然后用like 2/%查询从数据库中取出它

于 2013-06-28T11:51:44.490 回答