Rails可以一口气捕获所有需要的关联吗?

问题描述

您应该使用.includes

文档

解决N + 1个查询问题

通过Active Record,您可以预先指定要加载的所有关联。通过指定Model.find调用的include方法可以做到这一点。通过包含,Active Record可确保使用尽可能少的查询数来加载所有指定的关联。

再次讨论上述情况,我们可以重写Client.all以使用急切的加载地址:

clients = Client.includes(:address).limit(10)

clients.each do |client|
  puts client.address.postcode
end

或者,在您的情况下,

Comment.includes(:user)

解决方法

我有一个模型Comment,它具有has_a个用户。

在显示页面中,我正在执行Comment.all,然后显示每个注释。

在视图中,我不仅需要显示评论,还需要显示有关关联用户(即作者)的信息。

<% @comments.each do |comment| %>
    <%= comment.user.name %>
    <%= comment.user.email %>
    ...etc...
<% end %>

很好,一切都很好,但是activerecord可以SELECT * FROM users WHERE USER.id = commentId根据我的每个注释将其转换为一个查询。

这有点荒谬,尤其是在包含数百条评论的页面上。(这是数百个单独的数据库命中!)

当我执行Comment.all时,有什么地方告诉rails不仅要获取注释,还要获取关联的用户,然后稍后再调用comment.user.blah时,它不再从数据库中获取它。
?(这样,它将在一个db语句中完成所有操作)。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...