🐥
【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のいろいろ
遅延読み込み以外の特徴も軽く紹介しておきます↓
- 配列っぽく
.each
,.map
,.size
などが使える -
.where
,.order
,.limit
などのクエリチェーンもできる -
.build
,.create
,.destroy_all
などアソシエーションに便利な操作ができる
Railsの関連付けを支える超重要オブジェクトですね!
まとめ
今回はActiveRecord::Associations::CollectionProxyについて簡単にまとめてみました。
「配列っぽい賢いオブジェクト」とだけでも知っておくといいと思います!
参考
Discussion