我有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。
答案 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/%
查询