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 для база данных.

Другие вопросы по тегам