2013-10-07 69 views
2

我試圖優化數據庫查詢,因此在適當的地方添加了0​​。Rails模型:包含自己的方法

什麼是適當的方式在我的模型內的方法中使用它?例如,如果我有一個方法,在我的模型,如:

def some_method 
    self.child_models.each do |child_model| 
     total_score += child_model.attribute 
    end 
end 

如何在這樣的情況下,使用includes?他很自然地不喜歡這樣,但它不工作:

def some_method 
    self.includes(:child_model).child_models.each do |child_model| 
     total_score += child_model.attribute 
    end 
end 

大多數時候,我產生n + 1個查詢好像我引用模型自我,但我似乎無法找到任何這個例子。

謝謝!

回答

0

您在實例方法中使用self,所以self是您的類的實例,但包含的是類方法。您需要使用您的原始示例代碼才能使用包括Model.includes(:related_model)。我想你真正想要的是:

def some_method 
    self.child_models.sum('attribute') 
end 

我會用包括當我建立條件的關係不是看一個實例的孩子。

+0

謝謝@JosephL - 這是一個偉大的想法,具體的例子,但我要求更一般的情況下,兒童模型的邏輯更復雜。我想你說的是,一旦實例被初始化,我不能再調用類方法,因爲實例不包含子類。最好的解決方案是在控制器級使用include嗎?這感覺不雅,因爲在使用模型方法時,我可能會忘記在控制器級別執行此操作。 –

+0

好吧,你是對的 - 我想關鍵的信息是如果你想在一個實例上使用它,那麼你在錯誤的地方做它。我可能最好依靠子彈寶石,並在模型實例的實例化時調用include。 –

相關問題