【Rails】ActiveRecord_Relationのインスタンスはなぜmapが使えるのか
やってみたこと
ActiveRecord_Relationのインスタンスを生成してみました。
User.all.class #=> User::ActiveRecord_Relation
.all
だったり、.where
で取得したレコードはActiveRecord_Relationクラスのインスタンスとなります。
そして、mapメソッドを使うとなんとArrayになります。
User.all.map { |v| v }
これで取得したレコードの配列を生成することが出来ます。
そして最後にActiveRecord_Relationクラスのインスタンスがmapメソッドを持っているか確認してみました。
User.all.class.methods.include?(:map) #=> false
疑問
mapもってないじゃん。
なぜmapが使えるのか
答え
ActiveRecord::RelationがEnumerableモジュールをインクルードしていて、Enumerableモジュールはmapメソッドを持っているのでそれを使っている。と推理。
includeしている瞬間の映像はこちら。(githubのソースより。)
github.com
include Enumerable
Enumerableモジュールが持っているメソッドはこちら。
docs.ruby-lang.org
これによって、見事にmapメソッドを使うことが出来るのでした。
今回は、これで以上です。
Ruby on Rails 6 実践ガイド (impress top gear)
- 作者:努, 黒田
- 発売日: 2019/12/20
- メディア: 単行本(ソフトカバー)