我是rails的初学者。我已经了解了两种不同的方法来返回相同的结果。
这两者有什么区别?什么情况需要你从另一个中选择一个?
示例1:
Object.find(:all).select {|c| c.name == "Foobar" }.size
示例2:
Object.count(:conditions => ['name = ?', 'Foobar'])
进一步说明:
我真的希望我能为每个人投票给出正确答案。非常感谢。我刚刚得到了严肃的确认。
答案 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中执行。好多了:))