いくつかのクエリを最適化しようとしています。特定の課題の 1 つは、ポリモーフィック モデルを積極的にロードしようとすることでした。この場合、UserView
はポリモーフィックであり、次の列があります。
user_id, user_viewable_id, user_viewable_type
このクエリを実行しようとすると。
@user_views = UserView.select('user_views.* AS user_views, songs.* AS songs, users.* AS users')
.joins('INNER JOIN users AS users ON user_views.user_id = users.id')
.joins('INNER JOIN songs AS songs ON user_views.user_viewable_id = songs.id')
.where(:user_viewable_type => 'Song').order('user_views.id DESC').limit(5)
クエリを熱心にロードしていないようです。MiniProfilerという gem を使用しています。これは、実際には 1 つではなく n+1 個のクエリを実行していることを示しています。
次の AR クエリは、次の SQL を返します。
SELECT user_views.* AS user_views, songs.* AS songs, users.* AS users FROM "user_views" INNER JOIN users AS users ON user_views.user_id = users.id INNER JOIN songs AS songs ON user_views.user_viewable_id = songs.id WHERE "user_views"."user_viewable_type" = 'Song' ORDER BY user_views.id DESC LIMIT 5
これは、すべてのレコードを 1 つのクエリで返します。これが AR で期待どおりに機能しない理由は奇妙です。
これを機能させる方法はありますか?