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

前端之家收集整理的这篇文章主要介绍了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对性能要好得多.

猜你在找的Ruby相关文章