我的理解是count
和length
应该为Ruby数组返回相同的数字。所以我无法弄清楚这里发生了什么(FactoryGirl设置为创建 - 保存到数据库 - 默认情况下):
f = Factory(:family) # Also creates one dependent member
f.members.count # => 1
f.members.length # => 1
m = Factory(:member, :family=>f, :first_name=>'Sam') #Create a 2nd family member
f.members.count # => 2
f.members.length # => 1
puts f.members # prints a single member, the one created in the first step
f.members.class # => Array
f.reload
[ Now count == length = 2, and puts f.members prints both members]
我模糊地理解为什么f需要重新加载,尽管我希望f.members
涉及对family_id=f.id
成员进行数据库查找,并且即使f过时也会返回所有成员。
但是计数怎么能与长度不同? f.members是一个数组,但是某个地方被覆盖的count
方法,还是Array.count实际上从Array.length返回不同的结果?这不是一个紧迫的问题,只是一个谜,可能表明我对Ruby或Rails的理解存在一个基本缺陷。
答案 0 :(得分:5)
在查看源https://github.com/rails/rails/blob/master/activerecord/lib/active_record/associations/collection_association.rb时,length调用内部集合上的size方法,并计算实际调用数据库的数量。