ActiveRecordのincludes, preload, eager_load の個人的な使い分けのブログから
https://moneyforward-dev.jp/entry/2019/04/02/activerecord-includes-preload-eagerload/
・preloadは指定したアソシエーションを別クエリで取得してキャッシュ
・eager_loadは指定したアソシエーションをleft joinで取得しキャッシュ
・includeメソッドhttps://github.com/rails/rails/blob/a86199e54c4256327ace2d46de836560ce84b7af/activerecord/lib/active_record/relation/query_methods.rb#L250
・spwanでActive::Relationでリレーションを追加し行く
https://github.com/rails/rails/blob/a86199e54c4256327ace2d46de836560ce84b7af/activerecord/lib/active_record/relation/spawn_methods.rb#L9
実行時
・ここがActive Recordのメソッド委譲系あたりっぽい(メタプロ使ってリレーションで取得してそうな気がする)
https://github.com/rails/rails/blob/main/activerecord/lib/active_record/relation/delegation.rb
・例えばto_aする
https://github.com/rails/rails/blob/a86199e54c4256327ace2d46de836560ce84b7af/activerecord/lib/active_record/relation/delegation.rb#L100
・recordというメソッドに委譲
https://github.com/rails/rails/blob/a86199e54c4256327ace2d46de836560ce84b7af/activerecord/lib/active_record/relation.rb#L352
・loadを呼び出し
https://github.com/rails/rails/blob/a86199e54c4256327ace2d46de836560ce84b7af/activerecord/lib/active_record/relation.rb#L1197
・exec_queriesの呼び出し
https://github.com/rails/rails/blob/a86199e54c4256327ace2d46de836560ce84b7af/activerecord/lib/active_record/relation.rb#L1421
・その中でexec_main_queryというのを呼び出しており、eager_loding?の判定を行う
https://github.com/rails/rails/blob/f5058b6f6c58633377fb717aea9737ee11f2cf61/activerecord/lib/active_record/relation.rb#L1445
・eagar_loadingメソッド https://github.com/rails/rails/blob/a86199e54c4256327ace2d46de836560ce84b7af/activerecord/lib/active_record/relation.rb#L1256
・belongs_to, has_one アソシエーションについては eager_load
・has_many なアソシエーションについてはpreloadする
・has_manyのリレーションでeager loadするとスロークエリになりやすい→left joinなのでhas_manyだと重複含む
・それをdistinctで絞り込むのだが、そこがスロークエリになりやすい→だからidだけ取ってきてdistinctするのか
#rails