Ruby 1.92 в Rails 3: случай, когда Array.length не равен Array.count? - PullRequest
0 голосов
/ 25 марта 2011

Насколько я понимаю, 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 Ответ

5 голосов
/ 25 марта 2011

При просмотре источника, https://github.com/rails/rails/blob/master/activerecord/lib/active_record/associations/collection_association.rb, length вызывает метод size для внутренней коллекции, и count фактически учитывает количество вызовов в базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...