我正在尝试在查询上使用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来限制包含中的字段?
答案 0 :(得分:1)
您需要使用user_for_display
而不是user
进行查询。
p.first.comments.first.user_for_display.name