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 中没有按预期工作。

任何想法如何让它发挥作用?

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 回答