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
Rails 3.2.3中的大小,长度和数量没有区别,不是吗?
解决方法
长度将加载所有的对象只是为了计数它们;就像是:
select * from addresses...
然后返回结果计数.
你可以想象 – 这是不好的表现
计数将发布
select count(*) from addresses...
这是更好的,因为我们没有加载所有地址只是为了计数它们
大小更聪明 – 它会检查关联是否已经加载,如果为true,则返回长度(不发出对数据库的调用).
如果您的用户模型中有一个名为address_count的字段,size也会检查counter_cache,那么size将使用该字段进行计数,因此不需要在地址表上发出计数.
如果全部失败,size将在数据库上发出select count(*)