微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ruby-on-rails – 如何避免多个查询:包含在Rails中?

如果我这样做
post = Post.find_by_id(post_id,:include => :comments)

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

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

解决方法

不,那里没有.这是以下行为:包括,因为JOIN方法最终没有效率.

例如,考虑以下情况:Post模型有3个字段,您需要选择,2个字段为注释,这个特定的帖子有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次.现在,假设邮政有10个你感兴趣的领域,其中8个是文本块.好恶.这是很多数据.将数据从数据库传输到Rails在cpu周期和RAM两方面都能正常工作,因此最小化数据传输对于使应用程序运行速度更快,更精简是至关重要的.

Rails开发人员掌握了数字,大多数应用程序在使用多个查询时运行得更好,这些查询只能获取每一位数据一次,而不是一个有潜力获得巨大冗余的查询.

当然,为了运行复杂的条件,有必要加入一个开发人员的时间,并且可以通过以下方法来实现:include with:join.然而,对于预取关系,Rails所采用的方法:include对性能要好得多.

原文地址:https://www.jb51.cc/ruby/272417.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐