当使用与有限列的关系时,包括仍然导致第二个数据库查询
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
我正在尝试在查询中使用 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