1

いくつかのクエリを最適化しようとしています。特定の課題の 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 で期待どおりに機能しない理由は奇妙です。

これを機能させる方法はありますか?

4

1 に答える 1

10

熱心な読み込みに関するRailsのドキュメントには、ポリモーフィックな関連付けincludesで動作すると書かれています。したがって、次のように書くだけです。

@user_views = UserView.includes(:user_viewable).
  where(:user_viewable_type => 'Song').order('id DESC').limit(5)
于 2012-08-10T22:21:29.143 に答える