Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 这两种说法有什么不同,你为什么选择它们?_Ruby On Rails_Ruby_Activerecord - Fatal编程技术网

Ruby on rails 这两种说法有什么不同,你为什么选择它们?

Ruby on rails 这两种说法有什么不同,你为什么选择它们?,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,我是rails的初学者。我已经了解了两种不同的方法来返回相同的结果 这两者有什么区别?什么样的情况需要你从中选择一个呢 示例1: Object.find(:all).select {|c| c.name == "Foobar" }.size Object.count(:conditions => ['name = ?', 'Foobar']) 示例2: Object.find(:all).select {|c| c.name == "Foobar" }.size Object.cou

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

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

示例1:

Object.find(:all).select {|c| c.name == "Foobar" }.size
Object.count(:conditions => ['name = ?', 'Foobar'])
示例2:

Object.find(:all).select {|c| c.name == "Foobar" }.size
Object.count(:conditions => ['name = ?', 'Foobar'])
进一步说明


我真希望我能投票给每个人正确的答案。非常感谢你。我刚刚对rails进行了一次严肃的确认。

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


在示例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
例1:

这将构造一个查询:

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

例2:

这将构造一个查询:

SELECT count(id) FROM objects WHERE name = 'Foobar'
让sql完成所有的繁重工作,只返回一个整数,即满足条件的多个对象


通常您不需要2—更快、更少的内存。

示例1将从DB加载所有记录(假设对象是ActiveRecord模型),然后使用Ruby缩小集合,然后返回该数组的大小。因此,这可能会占用大量内存和CPU—不太好


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

当然,那么为什么第一个存在呢;DSimple-如果您需要数据,并且需要计数怎么办?我错了——第二个总是使用select count。。。到DB。查找和大小有时会更智能。第一种方法结合了3种不同的方法,如果您仍然希望获取所有对象而不考虑数量,则可以使用它。这与上面的示例有关吗?1.-if Object.name==“Foobar”/2。)if Object(:conditions=>['name=?','Foobar'])?令人惊讶。但是为什么会有人使用第一个例子呢?@trip来回答下面的问题,“1为什么存在”————————————————————————————————————————————————————————————————————————————————————————————————。。。。但是,如果您确实有一个对象数组,则需要使用select/collect将您的数组操纵到其他数组中。映射/减少类型的内容。这是否与上面的示例相关?如果对象(:条件=>['name=?','Foobar'])?