2015-04-01 48 views
1

我使用嵌套集來表示嵌套註釋(1討論有很多評論,評論可以回覆),我想(如果可能)急於加載答案註釋。嵌套集模型中的負載關聯

目前我加載所有的根節點並遍歷它們,如果它們有後代我渲染它們。但是,如果有很多根節點有答案,則會觸發大量的數據庫請求。

註釋有這些列: rgt, lft, parent_id

我試圖創建一個這樣的關係:

class Comment < ActiveRecord::Base 
    has_many :answers, -> (node) { where("lft > ? AND rgt < ?", node.lft, node.rgt) }, class_name: "Comment", foreign_key: :parent_id 
end 

這將提取的答案的評論評論實例調用時。但是,如果我嘗試eager_load它(Discussion.comments.includes(:answers)),它會爆炸,因爲node是零。

是否有可能加載類似這樣的東西?

+0

什麼'node'?什麼是_「所有根節點」_?爲什麼你的'has_many:answers'裏面有'class_name:'Comment''? – smathy 2015-04-01 16:43:32

+0

我的猜測是他有一個共同的模式來回答和評論。只是一個不同的名字。 :P – argentum47 2015-04-01 16:46:44

+0

評論屬於討論(並不重要)。評論有很多答案(答覆),這也是評論。一個根節點是一個評論,它不是回覆(回覆)到另一個評論(parent_id = nil)。 – Linus 2015-04-01 16:57:20

回答

0

我想,我找到了一個解決方案。 如果我看到它,你的數據模型是這樣的:

Discussion 
---------- 
... 

Comment 
---------- 
discussion_id:int 
parent_id:int 
lft:int 
rgt:int 

然後AR模型類將是:

class Discussion < ActiveRecord::Base 
    has_many :comments 
end 

class Comment < ActiveRecord::Base 
    belongs_to :discussion 
end 

要急於負荷討論(ID == 1)用其所有的樹意見及答案使用:

d = Discussion.includes(:comments).find(1) 

這使得對於給定的討論所有評論內存(d.comments)的集合。

現在我們可以操縱這個集合來獲得任何特定評論的答案,而無需額外的數據庫查詢。只需添加這Discussion類:

def comment_roots 
    self.comments.select {|c| c.parent_id.nil? } 
end 

,這給Comment類:

def answers 
    self.discussion.comments.select {|c| c.parent_id = self.id } 
    end 

    def answers_tree 
    self.discussion.comments.select {|c| self.lft < c.lft && c.rgt < self.rgt } 
    end 

例子:

d.comment_roots.first.answers