2011-05-18 129 views
3

这几乎在Difference Between find and Where with Relationships中回答,但不完全相同。 (请注意,我是如何巧妙地改变了问题的标题!) 我做的查询“where”和“find”之间的区别

a = Libation.where("user_id = 1") # gets 10 records 
b = a.sum("count * weight")   # Get right answer 
c = Libation.where("user_id = 2") # gets 8 records 
d = c.sum("count * weight")   # Get right answer 

现在我做

e = Libation.all    # gets 18 records, good 
f = e.sum("count * weight")  # BOOM! I get 

NoMethodError (undefined method `+' for #<Libation:0x3b91e88>): 

坚果。我试图找到相关的文档,但发现很少。或者我不在正确的位置。

回答

6

#where返回一个ActiveRecord::Relation对象,您可以在其上执行其他方法(如#sum)。但是,#all执行该查询会返回一个结果数组,因此当您执行e.sum(...)时,您试图在Array对象上执行#sum而不是ActiveRecord::Relation对象。

您可以尝试使用#scoped代替:

e = Libation.scoped 
f = e.sum("count * weight") 
+0

谢谢,非常好的解释。关于时间我读了范围。 – rtfminc 2011-05-20 06:39:47

1

Model.where(condition)返回一个活动的关系,所以当你a = Libation.where(...)你没有得到一个数组,而是一个主动的关系上,您可以链接其他方法你做下面b = a.sum(...)

Libation.all返回对象的数组,实际执行的数据库查询(用在哪里,只有当你试图在返回的结果迭代例如查询调用)

+0

谢谢!感谢你的回答。 – rtfminc 2011-05-20 06:41:38

相关问题