MapperであるActiveRecordを使っているときに、Polymorphicな関連先に対して更にPreloadする方法について触れます。Twitterの通知一覧画面のような機能を開発しているとします。このとき、Model、Controller、Viewをそれぞれ以下のようなコードにしてみます。1件ごとに個別にSELECTクエリが発行されてしまうため、関連するレコードをPreloadすることを考えます。endしかし、このコードではエラーが発生します。Mentionはmentionedtweetに紐付いているものの、Favoriteがmentionedtweetに紐付いていないためです。関連を取り除き、二つの別の名前の関連に分けます。利用してそれぞれの関連が成り立つための条件を与えます。したときに、条件に一致するnotificationだけfavoriteをpreloadするようになります。endControllerControllerでは、Preloadする対象をobjectから変更します。favoriteについては関連するtweetを、mentionについては関連するmentioned_tweetとtweetをそれぞれPreloadさせます。endViewViewも、notification.objectではなく、notification.favoriteやnotification.mentionを参照するように変更しておきます。返信しました結果これで、以下のようにN+1クエリ問題が少し緩和されます。(25)課題FavoriteとMentionのそれぞれについて別々にTweetを問い合わせているところが、少し無駄と言えるかもしれません。何も対策しないよりは幾分マシでしょう。出来るかもしれません。