登录 主页

如何解决 n + 1问题

2023-09-02 11:14AM

原代码如下:

 @enterprises = @enterprises.where('name like ?', "%#{params[:name]}%") if params[:name].present?
 @categories = @enterprises.select(:enterprise_category).distinct.map(&:enterprise_category)
 @enterprises = @enterprises.where('enterprise_category = ?', params[:enterprise_category]) if params[:enterprise_category].present?
 @enterprises = @enterprises.where('person_in_charge = ?', params[:person_in_charge]) if params[:person_in_charge].present?
 @enterprises = @enterprises.where('person_in_charge_tel = ?', params[:person_in_charge_tel]) if params[:person_in_charge_tel].present?
 @enterprises = @enterprises.order(created_at: :desc).page(params[:page] || 1).per(params[:per_page] || 10)

打印出来的日志是这样的:

在代码第一行中,增加下面代码

@enterprises = @enterprises.includes(:material_reserves)

修改后,打印出来的日志是这样的:

poe的解释如下:

在代码 `@enterprises.includes(:material_reserves)` 中,`(:material_reserves)` 是指定要预加载的关联关系的名称。这里的 `:material_reserves` 是一个符号(Symbol),它对应于定义在 `Enterprise` 模型中的关联关系。

通过在 `includes` 方法中指定关联关系名称,ORM工具可以根据这个名称找到正确的关联关系,并在执行查询时预加载相关的数据。

在这个例子中,假设 `Enterprise` 模型定义了一个 `has_many` 关联关系,将其命名为 `:material_reserves`,表示一个企业可以拥有多个原材料储备。因此,当我们在查询 `@enterprises` 对象时,使用 `includes(:material_reserves)` 告诉 ORM 工具预加载企业的原材料储备数据。

预加载关联数据的方式因不同的 ORM 工具而异,对于 Ruby on Rails 中的 ActiveRecord,使用 `includes` 方法可以指定要预加载的关联关系。在括号中写入关联关系的名称,可以确保 ORM 工具正确地加载该关联关系的数据。

需要注意的是,关联关系的名称必须与模型定义中的名称一致,才能被正确识别和加载。如果关联关系名称不正确,预加载可能无法生效,导致仍然出现额外的查询。因此,在使用 `includes` 方法时,确保正确指定关联关系的名称非常重要。

返回>>

登录

请登录后再发表评论。

评论列表:

目前还没有人发表评论