Ответ 1
Это ActiveRecord::Relation
, но Rails намеренно лжет вам. Вы можете видеть это уже в вызовах метода и продолжать видеть его, вызывая ancestors
, который включает в себя множество классов ActiveRecord:
c1.articles.ancestors.select { |c| c.to_s =~ /ActiveRecord/ }.size #=> 35
который показывает, что он не очень сильно отличается от Array
.
Это происходит потому, что вы возвращаетесь при вызове c1.articles
ActiveRecord::Associations::CollectionProxy
*, который undefines class
(наряду со многими другими методами). Это означает, что class
передается через его method_missing
, который отправляет до target
. Как мы видим, класс target
здесь, фактически, Array
:
c1.articles.target.class #=> Array
Вот откуда происходит c1.articles.class
. Тем не менее, это ActiveRecord::Relation
.
<суб > * Мы можем проверить, что это действительно ActiveRecord::Associations::CollectionProxy
, вызывая метод Rubys original class
для рассматриваемого объекта: Object.instance_method(:class).bind(c1.articles).call
. Это хороший трюк, чтобы убедиться, что объект не пытается притворяться другим классом.
Суб >