当使用与有限列的关系时,包括仍然导致第二个数据库查询

Includes still result in second database query when using relation with limited columns

我正在尝试在查询中使用 includes 来限制渲染时触发的后续数据库调用的数量,但我还希望包含调用 select 来自相关表。具体来说,我想获取一组帖子、他们的评论,以及写每条评论的用户的姓名。

所以我添加了

belongs_to :user

belongs_to :user_for_display, :select => "users.id, user.name", :class_name => "User", :foreign_key => "user_id"

到我的评论模型。

从控制台,当我这样做时

p = Post.where(:id => 1).includes(comments: [:user_for_display])

我看到正确的查询触发了:

SELECT posts.* FROM posts WHERE posts.id = 1
SELECT comments.* FROM comments comments.attachable_type = "Post" AND comments.attachable_id IN (1)
SELECT users.id, users.name FROM users WHERE users.id IN (1,2,3)

但打电话给

p.first.comments.first.user.name

仍然会导致完整的用户加载数据库调用:

User Load (0.5ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 11805 LIMIT 1
=> "John"

仅引用 p.first.comments 不会触发第二个评论查询。如果我包含完整的 :user 关系而不是 :user_for_display,获取用户名的调用不会触发第二个用户查询(但我不想加载完整的用户记录) .

是否可以使用 SELECT 来限制包含中的字段?

您需要使用 user_for_display 而非 user 进行查询。

p.first.comments.first.user_for_display.name