Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 简单递归法_Ruby On Rails_Ruby - Fatal编程技术网

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)
是您所需要的全部。