Rails中的大小,长度和计数

20 ruby ruby-on-rails

1.9.3p194 :002 > u = User.find_by_email("email@mail.ru")
1.9.3p194 :005 > u.addresses.size
 => 1 
1.9.3p194 :006 > u.addresses.length
 => 1 
1.9.3p194 :007 > u.addresses.count 
Run Code Online (Sandbox Code Playgroud)

Rails 3.2.3中的大小,长度和计数没有区别,不是吗?

Che*_*her 43

length将加载所有对象以计算它们; 就像是:

select * from addresses...
Run Code Online (Sandbox Code Playgroud)

然后返回结果计数.你可以想象 - 这是糟糕的表现

伯爵只会发出

select count(*) from addresses...
Run Code Online (Sandbox Code Playgroud)

这是更好的,因为我们没有加载所有地址只是为了计算它们

size更聪明 - 它将检查关联是否已加载,如果为true则返回长度(不发出对数据库的调用).

如果您的用户模型中有一个名为address_count的字段,size也会检查counter_cache,那么size将使用此字段进行计数,因此无需在地址表上发出计数.

如果全部失败,大小select count(*)在数据库上发出a

  • 长度通常是最佳选择。如果您打算在检查记录数后对记录做某事,那么使用`size`可能会导致两次数据库访问,而使用`length`只会导致一次数据库访问。 (2认同)