2011-05-09 86 views
3

我有嵌套在文档中的注释树,使用mongoid embeds_many_recursively这样的:有效的方式来与mongoid显示嵌套树和轨道

Document: { 
    ... 
    comments: [{ 
     ... 
     updated_at, 
     child_comments: [{ 
     ... 
     updated_at 
     child_comments: [{...},{...}], 
     ...},{...}] 
     ...}] 
    ...}] 
    ...} 

什么是它传递给视图的最有效的方法按照第一级“comment updated_at”属性排序的方式?

在我这次来到主文档模型内部的时刻:

def flatten_comments 
    @flat_comments = [] 
    self.comments.order_by([[:updated_at, :desc]]).each do |comment| 
     flatten_comments_iterator(comment) 
    end 
    return @flat_comments 
    end 

    def flatten_comments_iterator(comment) 
    @flat_comments << comment 
    comment.child_comments.each {|reply| flatten_comments_iterator(reply)} 
    end 

,然后只需在视图中的阵列上进行迭代。

问题是: 1)在递归展平时,订单在某处丢失了,我无法确定在哪里,一步步在纸上看来似乎是按照需要的顺序添加项目,可能有些东西处理类变量作用域和访问。

2)我不确定这是做一个简单的检索最有效的方法。

对于如何有效处理这类任务的建议和经验值得感谢。

回答

2

基本上有两种设计方法(其中一种与您的设计方法相同)在ruby driver's modeling examples上进行了说明。关于它也有类似的question on SO

关于另一个问题:关于递归性没有什么不好,一般来说,如果注释没有很大的嵌套深度。但是,您的实现不是线程安全的,因为它使用实例变量,而不是局部变量。要处理它,你应该将@flat_comments转换为局部变量,并将其作为参数传递给flatten_comments_iterator方法。

提示:因为任何method recursion can be transformed to a iteration,你可能想要实现的是图的iterative preorder traversal