みずラテ

牛乳と水を2対1で。

【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)

Ruby on Rails 6 実践ガイド (impress top gear)

  • 作者:努, 黒田
  • 発売日: 2019/12/20
  • メディア: 単行本(ソフトカバー)