Это потому, что при выполнении .all
запрос фактически выполняется, поэтому возвращаемый объект будет базовым массивом. Однако, когда вы выполняете Category.first
, он возвращает объект Category, тогда articles
фактически использует ActiveRecord::Reflection::AssociationReflection
и выполняет расширение массива. Например, в rails c
попробуйте:
Category.first.articles.ancestors
против
Category.first.articles.all.ancestors #throws an error
Второй выдает ошибку, потому что в этот момент объект представляет собой простой массив. Первый, однако, состоит из чего-то вроде этого:
Article(...), ActiveRecord::Base, ActiveRecord::Reflection, Object (and so on)
В качестве другого примера попробуйте это:
a = Category.first.articles; ObjectSpace.each_object(Class).select {|k| a < k }
#=> [Object, BasicObject, ActiveRecord::Base]
Вы можете видеть, что, хотя он выглядит как массив, он наследует другие классы.