Rails 3中的Ruby 1.92:Array.length不等于Array.count的情况?

时间:2011-03-25 15:31:57

标签: arrays ruby-on-rails-3 activerecord count

我的理解是countlength应该为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的理解存在一个基本缺陷。

1 个答案:

答案 0 :(得分:5)

在查看源https://github.com/rails/rails/blob/master/activerecord/lib/active_record/associations/collection_association.rb时,length调用内部集合上的size方法,并计算实际调用数据库的数量。