はじめに
find_by_sql
を使って複雑なSQL文を書いたが、N+1を避けるために preload
したい時がある。
結論
下記のように書けばOK
records = User.find_by_sql(...)
ActiveRecord::Associations::Preloader.new.preload(records, :like)
下記はpreload
が無視されるのでダメ
User.preload(:like).find_by_sql(...)
注意点
Rails7 で記法が下記のように変わる
records = User.find_by_sql(...)
ActiveRecord::Associations::Preloader.new(records: records, associations: :like).call
参考
https://www.natsuneko.blog/entry/2017/04/18/find_by_sql-preload
https://michiomochi.com/blog/rails-v6047-to-v7023