gpt4 book ai didi

ruby-on-rails - 如何避免使用 :include in Rails? 进行多次查询

转载 作者:行者123 更新时间:2023-12-03 22:51:54 26 4
gpt4 key购买 nike

如果我这样做

post = Post.find_by_id(post_id, :include => :comments)

执行两个查询(一个用于帖子数据,另一个用于帖子的评论)。然后当我做 post.comments 时,不会执行另一个查询,因为数据已经缓存。

有没有办法只做一个查询并仍然通过 post.comments 访问评论?

最佳答案

不,那里没有。这是 :include 的预期行为, 自 JOIN方法最终证明是低效的。

例如,考虑以下场景:Post模型有 3 个字段需要选择,2 个字段用于 Comment ,并且这个特定的帖子有 100 条评论。 Rails 可以运行单个 JOIN沿着以下路线查询:

SELECT post.id, post.title, post.author_id, comment.id, comment.body
FROM posts
INNER JOIN comments ON comment.post_id = post.id
WHERE post.id = 1

这将返回以下结果表:
 post.id | post.title | post.author_id | comment.id | comment.body
---------+------------+----------------+------------+--------------
1 | Hello! | 1 | 1 | First!
1 | Hello! | 1 | 2 | Second!
1 | Hello! | 1 | 3 | Third!
1 | Hello! | 1 | 4 | Fourth!
...96 more...

你已经可以看到问题了。单查询 JOIN方法,虽然它返回你需要的数据,但返回它是多余的。当数据库服务器将结果集发送到 Rails 时,它将分别发送帖子的 ID、标题和作者 ID 100 次。现在,假设 Post有 10 个您感兴趣的字段,其中 8 个是文本块。呃。这是很多数据。将数据从数据库传输到 Rails 确实需要双方的工作,包括 CPU 周期和 RAM,因此最小化数据传输对于使应用程序运行得更快更精简很重要。

Rails 开发人员处理了这些数字,并且大多数应用程序在使用多个查询时运行得更好,这些查询只获取每一位数据一次,而不是一个有可能变得非常冗余的查询。

当然,在每个开发人员的生活中,有时都需要连接才能运行复杂的条件,这可以通过替换 :include 来实现。与 :joins .然而,对于预取关系,Rails 采用的方法 :include性能要好得多。

关于ruby-on-rails - 如何避免使用 :include in Rails? 进行多次查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6246826/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com