Ruby on rails 简单递归法
我有一个黑板模型。董事会可以订阅其他董事会(作为提要)。 假设我有一棵这样的树: 因此:Ruby on rails 简单递归法,ruby-on-rails,ruby,Ruby On Rails,Ruby,我有一个黑板模型。董事会可以订阅其他董事会(作为提要)。 假设我有一棵这样的树: 因此: Board.find(2).提要是Board 5和Board 7 Board.find(7).提要是Board 2和Board 6等 我想写一个方法all_feed,它返回某个电路板所有级别的所有feed。例如: Board.find(7)。所有_提要都将输出ID为2,6,5,11的板阵列 我从以下内容开始: def all_feeds if feeds.empty? return
Board.find(2).提要是Board 5和Board 7
Board.find(7).提要是Board 2和Board 6等
我想写一个方法all_feed
,它返回某个电路板所有级别的所有feed。例如:
Board.find(7)。所有_提要都将输出ID为2,6,5,11的板阵列
我从以下内容开始:
def all_feeds
if feeds.empty?
return
else
feeds.each {|feed| feed.all_feeds}
return feeds
end
end
可能必须将此返回提要添加到某个全局数组中,但不确定应该如何执行此操作
谢谢你的帮助
注:这并不总是一个二叉树,您可以有2个以上的提要。我想您想要的可以通过以下方式实现:
def all_feeds
unless feeds.empty?
feeds + feeds.map(&:all_feeds).flatten.compact
end
end
使结果为一维,同时删除nil组件
有关映射(&:all_feed)
部分的说明,您可以参考:)看起来它适用于以下代码:
def all_feeds
if feeds.empty?
self
else
[self]+feeds.map(&:all_feeds)
end
end
如果它被允许使用宝石宝石将有助于做到这一点
Board.find(7).descendants
在这种情况下,它肯定是一个对db的请求,没有任何递归,这对性能更好
您可以在不使用宝石的情况下(或在其顶部)实现祖先理念:
- 将
祖先
字段添加到您的模型中
- 构建树时正确填充它(对于ID为2和6的嵌套节点,它将是
2/7
,ID为5和11-2/7/6
)
- 然后用
像2/%
查询一样从数据库中获取它
它不起作用,我添加了新的答案,代码我认为是有效的,必须对其进行测试。哎呀,我想我以前忘了包含当前级别的提要。查看更新的答案!我猜这里有一个递归,节点id=2,每次映射all_feed
时,它都会返回自己的树,在它内部all_feed
应该总是返回相同的类型<代码>[self]+feeds.map(&:all\u feeds)
是您所需要的全部。