“where”和“find”之间的区别

时间:2011-05-18 22:48:04

标签: ruby-on-rails

这几乎在Difference Between find and Where with Relationships中回答,但并不完全。 (请注意我是如何巧妙地改变问题标题的!) 我做查询

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>):

螺母。我试图找到相关的文档,但发现很少。或者我找不到合适的地方。

2 个答案:

答案 0 :(得分:6)

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

您可以尝试使用ActiveRecord::Relation代替:

#scoped

答案 1 :(得分:1)

执行Model.where(condition)会返回一个活动关系,所以当你执行a = Libation.where(...)时,你不会得到一个数组,而是一个活动关系,你可以在其上链接其他方法{{1} }

b = a.sum(...)返回一个对象数组,实际执行查询到数据库(通过使用where,只有在尝试迭代返回的结果时才调用查询)