Ruby 1.92 в Rails 3: случай, когда Array.length не равен Array.count?
Я понимаю, что 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.
1 ответ
Посмотрев на источник, https://github.com/rails/rails/blob/master/activerecord/lib/active_record/associations/collection_association.rb, length вызывает метод size для внутренней коллекции, а count фактически вызывает count для база данных.