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,它表明它實際上正在運行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中沒有按預期工作。

任何想法如何讓這個工作?

+1

[這裏](http://stackoverflow.com/a/16124295/936494)是一個很好的討論這個東西。希望它有助於在這個問題上獲得更好的見解。 – 2016-04-13 10:12:46

回答

10

Rails documentation about eager loadingincludes工作與多態關聯。所以你應該只寫:

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