我正在尝试在查询中使用 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 来限制 include 中的字段?
最佳答案
您需要使用 user_for_display
而不是 user
进行查询。
p.first.comments.first.user_for_display.name
关于ruby-on-rails - 当使用与有限列的关系时,包括仍然导致第二个数据库查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31846675/