2012-01-05 9 views
5

Ho un auto incollati modello:self-join eger che caricano in modo ricorsivo?

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 

Più tardi vorrei fare prima chiamata 1 SQL per afferrare tutte le osservazioni pertinenti, e quindi in modo ricorsivo li rende.

Come carico in modo ricorsivo?

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

Non dovrebbe essere 'show_comments (child)'? – Finbarr

+0

Oh sì, probabilmente ci sono errori di battitura nel codice, è solo pensato per presentare un'idea generale di ciò che voglio. –

+0

semplicemente messo: non è possibile. Vorrei consigliare di usare [awesome_nested_set] (https://github.com/collectiveidea/awesome_nested_set) o [ancestry] (https://github.com/stefankroes/ancestry) che sono entrambe implementazioni differenti che affrontano questo problema (strutture profondamente nidificate su un solo tavolo) –

risposta

3

Si potrebbe creare un metodo che recupera il profondo nidificazione di ID, caricare quelli, e le rotaie lo userà come una cache.

Problemi correlati