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

时间:2015-08-06 04:07:03

标签: ruby-on-rails ruby-on-rails-3 activerecord

我正在尝试在查询上使用includes来限制渲染时触发的后续数据库调用的数量,但我还希望include调用从相关表中选择列的子集。具体来说,我想获得一组帖子,他们的评论,以及撰写每条评论的用户的名字。

所以我添加了

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来限制包含中的字段?

1 个答案:

答案 0 :(得分:1)

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

p.first.comments.first.user_for_display.name