我目前有一个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有几个精华。