Chr*_*ini 1 polymorphism activerecord ruby-on-rails eager-loading ruby-on-rails-3
我正在尝试优化我们的一些查询.一个特别的挑战是试图加载多态模型.在这种情况下,UserView是多态的,并具有以下列:
user_id, user_viewable_id, user_viewable_type
Run Code Online (Sandbox Code Playgroud)
当我尝试运行此查询时.
@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)
Run Code Online (Sandbox Code Playgroud)
它似乎并不急于加载查询.我正在使用名为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
Run Code Online (Sandbox Code Playgroud)
它在一个查询中返回所有记录.奇怪的是,为什么这在AR中无法正常工作.
任何想法如何让这个工作?
Mic*_*ant 10
关于立即加载Rails文档说includes与多态关联的作品.所以你应该写:
@user_views = UserView.includes(:user_viewable).
where(:user_viewable_type => 'Song').order('id DESC').limit(5)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10588 次 |
| 最近记录: |