【发布时间】:2013-06-28 18:10:31
【问题描述】:
我目前有一个 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
【问题讨论】:
-
through:在我看来不像经典的父子层次结构,这是有原因的(使递归变慢)吗? -
我认为这是建立自我参照关系的合适方式。我的记录是计划中的活动,每个活动都链接到其他活动。如果有更好的方法,请告诉我?
-
伙计们,看起来嵌套集合不是我所追求的,因为我的对象可以有多个父对象。因此,如果有人可以提供一种简单的方法来提高我所拥有的代码的性能,将不胜感激。
-
如果你可以有多个父母和多个孩子,那么就有可能出现循环循环,你的递归代码就会中断。这描述了一个图结构。
标签: ruby-on-rails ruby activerecord recursion parent-child