2013-10-07 68 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。 –

相关问题