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

标签 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 来限制 include 中的字段?

最佳答案

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

p.first.comments.first.user_for_display.name

关于ruby-on-rails - 当使用与有限列的关系时,包括仍然导致第二个数据库查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31846675/

相关文章:

ruby-on-rails - 当多个应用程序在 Ruby 中共享同一个数据库时如何管理迁移?

mysql - 作为 mysql/rails 查询的一部分,对链接表中的记录进行计数

ruby - 验证嵌套表单中子对象的唯一性无法正常工作

ruby-on-rails - 输出在 rails 3.1 中呈现的 View 的名称

mysql - Rails 4 MySQL bigInt 主键问题和错误

mysql - 按提供的标签过滤表 - 事件记录

javascript - Disqus 评论无法在本地主机上加载?

ruby-on-rails - 使用 I18n 语言环境的 Rails 语言名称

ruby - 确定 Ruby 1.9.3 中的字符编码

mysql - 仅获取今天在 laravel 中创建的记录