🐥

【Rails】Collection Proxyって何者?

に公開

導入

例えば、本(book)と著者(Author)の間に1対多の関連付けがされているとします↓

class Author < ApplicationRecord
    has_many :books
end

class Book < ApplicationRecord
    belongs_to :author
end

このとき、Authorクラスでは以下のような便利なメソッドが使えるようになりますよね!

author = Author.first
author.books

このauthor.books、私はてっきり配列だと思っていたのですが、どうやら違うらしい...

ということで今回は、「ActiveRecord::Associations::CollectionProxy」というRailsの賢いオブジェクトについて、初心者なりにまとめてみようと思います!

author.booksの正体

話の流れでピンとくるとは思いますが、author.booksの正体は ActiveRecord::Associations::CollectionProxyクラスのインスタンスです。
名前だけ聞くと難しそうですが、簡単に言えば「関連付けされた複数のデータ(has_many)を便利に扱うための仕組み」です。

CollectionProxyの特徴

CollectionProxyは、遅延読み込みLazy Loading)をしてくれます。

例えば、author.books.countは、SQLを直接実行して件数だけを取得します。
つまり、Bookオブジェクト(レコード)は、この時点ではまだメモリ上にロードされません。

効率的なSQLクエリを内部で組み立ててくれるなんて!賢いですね!

CollectionProxyのいろいろ

遅延読み込み以外の特徴も軽く紹介しておきます↓

  1. 配列っぽく .each, .map, .sizeなどが使える
  2. .where, .order, .limitなどのクエリチェーンもできる
  3. .build, .create, .destroy_allなどアソシエーションに便利な操作ができる

Railsの関連付けを支える超重要オブジェクトですね!

まとめ

今回はActiveRecord::Associations::CollectionProxyについて簡単にまとめてみました。
「配列っぽい賢いオブジェクト」とだけでも知っておくといいと思います!

参考

Discussion