1

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

我想要以有效方式返回每条记录的所有后代或祖先的方法。我有一个递归地执行此操作的工作方法,但它当前填充了大量数组(最多 100k 条记录),然后将它们展平并删除重复项。有没有比我当前需要数小时才能运行所有记录的代码更有效的方法来实现这一点?我不认为 Ancestry 之类的 gem 适合,因为我没有严格的树形结构。

首先十分感谢。

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
4

2 回答 2

0

查看一种稍微不同的方式来表示嵌套集中的层次结构。 https://github.com/collectiveidea/awesome_nested_set

这消除了递归查询。

于 2013-06-28T18:22:24.750 回答
0

就其本质而言,使用最直接的模式是非常低效的。您可能需要考虑实施嵌套集模型。快速搜索显示 Rails 有几个宝石。

于 2013-06-28T18:24:11.900 回答