如何加载多态模型?

我正在尝试优化我们的一些查询。 一个特别的挑战是试图加载多态模型。 在这种情况下, 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,它表示它实际上运行的是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 

它在一个查询中返回所有记录。 奇怪的是为什么这在AR中没有像预期的那样工作。

任何想法如何让这个工作?

关于预先加载的Rails文档说明includes多态关联的工作。 所以你应该写:

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