如何渴望加载多态模型? [英] How to eager load a polymorphic model?

查看:87
本文介绍了如何渴望加载多态模型?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试优化一些查询.一个特殊的挑战是试图渴望加载多态模型.在这种情况下,UserView是多态的,并且具有以下列:

I'm trying to optimize some of our queries. One particular challenge was trying to eager load a polymorphic model. In this case, UserView is polymorphic and has the following columns:

user_id, user_viewable_id, user_viewable_type

当我尝试运行此查询时.

When I try to run this query.

@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,它表示它实际上正在运行n + 1个查询,而不只是在运行一个.

It doesn't seem to eager load the query. I am using a gem called MiniProfiler, which indicates that it is actually running n+1 queries, instead of just one.

以下AR查询返回此SQL:

The following AR query returns this 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

在一个查询中全部返回记录.奇怪为什么这在AR中无法按预期工作.

Which returns the records all in one query. Strange why this is not working as expected in AR.

有什么想法可以使它正常工作吗?

Any ideas how to get this to work?

推荐答案

Rails documentation about eager loading says includes works with polymorphic associations. So you should just write:

@user_views = UserView.includes(:user_viewable).
  where(:user_viewable_type => 'Song').order('id DESC').limit(5)

这篇关于如何渴望加载多态模型?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆