ruby父子递归优化



我目前有一个rails应用程序,它有数千条以父子关系链接的记录。

我想要以有效的方式返回每个记录的所有后代或祖先的方法。我有一个递归的工作方法,但它目前填充了大量的数组(多达10万条记录),然后对这些数组进行平坦化并删除重复项。有没有比我目前的代码更有效的方法来实现这一点,因为我的代码需要数小时才能运行所有记录?我不认为像Ancestry这样的宝石是合适的,因为我没有严格的树结构。

事先非常感谢。

class Record < ActiveRecord::Base
  has_many :children, through: :reverse_relationships, source: :child
  has_many :parents, through: :relationships, source: :parent

  def all_children
    children.map do |child|
      [child] + child.all_children
    end.flatten.uniq
  end
  def all_parents
    parents.map do |parent|
      [parent] + parent.all_parents
    end.flatten.uniq
  end
end

查看一种稍微不同的方式来表示嵌套集中的继承制。https://github.com/collectiveidea/awesome_nested_set

这消除了递归查询。

从本质上讲,使用最直接的模式是非常低效的。您可能需要考虑实现嵌套集模型。快速搜索显示Rails有几个精华。

最新更新