这两个陈述有什么区别,为什么要选择它们?

时间:2010-08-19 12:49:26

标签: ruby-on-rails ruby activerecord

我是rails的初学者。我已经了解了两种不同的方法来返回相同的结果。

这两者有什么区别?什么情况需要你从另一个中选择一个?

示例1:

Object.find(:all).select {|c| c.name == "Foobar" }.size

示例2:

Object.count(:conditions => ['name = ?', 'Foobar'])

进一步说明

我真的希望我能为每个人投票给出正确答案。非常感谢。我刚刚得到了严肃的确认。

4 个答案:

答案 0 :(得分:4)

Object.count总是命中数据库,find().... size()调用可以优化。这里讨论很好

http://rhnh.net/2007/09/26/counting-activerecord-associations-count-size-or-length

答案 1 :(得分:4)

示例1:

这构造了一个查询:

SELECT * FROM objects

然后将所有记录转换为内存中的对象集合,然后遍历每个对象以查看它是否满足条件,然后计算满足条件的元素数。

示例2:

这构造了一个查询:

SELECT count(id) FROM objects WHERE name = 'Foobar'

让sql完成所有艰苦工作,并返回一个整数 - 一些符合条件的对象。

通常你不需要2 - 更快,更少的内存

答案 2 :(得分:2)

在示例1中,您将从数据存储中获取所有对象,然后迭代所有对象,选择名称为Foobar的对象。然后获得该数组的大小。 示例1是明显的输家。

示例1 sql:

select * from whatever
# then iterate over entire array

示例2在SQL中执行where子句到数据存储区。

select count(id) from whatever where name = 'foobar'
# The SQL above is sql-server accurate, but not necessarily mysql or sqlite3

答案 3 :(得分:2)

示例1将从DB加载所有记录(假设Object是ActiveRecord模型),然后使用Ruby减少集合,然后返回该数组的大小。所以这可能是内存和CPU重 - 不好。

示例2在SQL中执行计数,因此所有繁重的工作都在数据库中执行,而不是在Ruby中执行。好多了:))