eager_loadはJOINしてキャッシュもしてくれるActiveRecordのメソッドだが、この仕様を正しくイメージできてなかったのではまった. has_manyに対してIN句検索したときに一部のhas_manyデータのみがキャッシュされて意図しない結果となった. joinsではキャッシュされないためこの問題は起こらないが、当然キャッシュされないので後から追加クエリが発行される. includesは条件によってeager_loadと同じ動きをするため今回の用途だと同じ問題が発生する. ActiveRecordのjoinsとpreloadとincludesとeager_loadの違い 再現 超簡単なhas_many関連を作成する. class User < ActiveRecord::Base has_many :roles end class Role < ActiveRecord::