2013-06-28 29 views
1

我目前有一个轨道应用程序,有成千上万的父子关系链接的记录。ruby​​父母子女递归优化

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

非常感谢。

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 
+0

'通过:'看起来不像经典的父子层次结构,是否有一个原因(使递归更慢)? –

+0

我在想这是建立自我指涉关系的适当方法。我的记录是一个时间表内的活动,每个活动链接到其他活动。如果有更好的方法,请让我知道吗? – Jimbo

+0

伙计们,它看起来像嵌套集不是我所追求的,因为我的对象可以有多个父母。因此,如果任何人都可以提供一种简单的方法来提高我所拥有的代码的性能,那么将会非常感激。 – Jimbo

回答

0

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

这消除了递归查询。

+0

感谢您指出这一点,我会试一试 – Jimbo

+0

DGM可以请你告诉我,当一个项目有多个父母时,嵌套集是否工作?我的申请中就是这种情况,这与我所见过的所有例子都不同。 – Jimbo

+0

哦,不,我错过了。嵌套集合是纯粹分层的。 – DGM

0

使用最直接的模式本质上相当低效。您可能需要考虑实施Nested Set Model。快速搜索显示Rails有几个宝石。