Hyurakuのエンジニア日誌

SE出身Webエンジニアのブログ

ActiveRecord::Associations::CollectionProxyとは何なのか #13

railsのアプリケーションを作成したときにクラスを調べていたさいに ActiveRecord::Associations::CollectionProxyと表示されたので、 今回はこのRelationについて調べてみる。

1. 表示された状況

次のコードを書いていたときに ActiveRecord::Associations::CollectionProxyと表示された。

class User < ApplicationRecord
  has_many :contacts
end

User.first.contacts.class
> ActiveRecord::Associations::CollectionProxy

2. Active Record::Associations::CollectionProxy

一対多の関係を表しているプロキシのこと。

公式ガイドでは次のように書かれている。(Google翻訳済)

アクティブレコードのアソシエーションプロキシは、アソシエーションを保持するオブジェクト(@owner)と実際の関連オブジェクト(@target)を仲介しています。 プロキシの関連付けの種類は@reflectionにあります。 これは、[ActiveRecord::Reflection::AssociationReflection](https://www.rubydoc.info/docs/rails/4.1.7/ActiveRecord/Reflection/AssociationReflection)クラスのインスタンスです。
  • ActiveRecord::Reflection::AssociationReflection アクティブレコードクラスで指定された関連付けに関するすべてのメタデータを保持するクラス

3. まとめ

  • ActiveRecord::Associations::CollectionProxy
    一対多の関係を表しているプロキシ
  • ActiveRecord::Reflection::AssociationReflection
    2つのオブジェクトのアソシエーション(has_many,belong_to等)に関連したすべてのメタデータを保持するクラス

今は一対多の関係を示している、ということを覚えていく。