2012-01-05 3 views
5

Mam własny dołączył model:self-join chętny ładowanie rekursywnie?

class Comment < ActiveRecord::Base 
    belongs_to :parent, :class_name => 'Comment', :foreign_key => 'parent_id' 
    has_many :children, :class_name => 'Comment', :foreign_key => "parent_id" 
end 

Później chcemy najpierw dokonać połączenia 1 sql porwać wszystkich istotnych uwag, a następnie rekurencyjnie czyni je.

Jak mogę rekursywnie chciwie załadować?

comments = Comment.where(:post_id => @post_id).includes(:comments=> [:comments => [:comments .... #How do I get this to recursively eager load? 

def show_comments(comment) 
    render comment 
    comment.children.each do |child| 
     show_comments(child) 
    end 
end 
+0

Czy nie powinno to być "show_comments (child)"? – Finbarr

+0

O tak, w kodzie są prawdopodobnie literówki, ma to jedynie na celu przedstawienie ogólnego pojęcia o tym, czego chcę. –

+0

Po prostu: nie możesz. Radziłbym, żeby użyć [awesome_nested_set] (https://github.com/collectiveidea/awesome_nested_set) lub [przodka] (https://github.com/stefankroes/ancestry), które są różnymi implementacjami rozwiązującymi ten problem (głęboko zagnieżdżone struktury na pojedynczy stół) –

Odpowiedz

3

Można stworzyć metodę, która pobiera głębokie zagnieżdżanie identyfikatorów, załadować tych, poręcze i użyje go jak cache.