控制器动作迭代,从而生成N+1条件

问题描述 投票:0回答:1

在循环内创建多个对象的控制器操作是 N+1 查询的候选者。 然而,下面的片段

shop_id = section.shop_id
section_id = section.id
serving_table_id = section.serving_table.id
range = 1..i
range.each do |i|
  @cover = Cover.create(shop_id: shop_id, section_id: section_id, serving_table_id: serving_table_id, name: i )      
end

尽管要保存的属性是在迭代块之前定义的,
通过

prosopite
gem 生成 N+1 查询检测,
对于每个 shop、parti 和serving_table 对象。

不是对集合的查询,

includes
将不适用。

在这种情况下如何避免 N+1 查询?

ruby-on-rails
1个回答
0
投票

ActiveRecord::Base#insert_all
https://apidock.com/rails/v7.1.3.4/ActiveRecord/Persistence/ClassMethods/insert_all)可以采用哈希数组来创建

shop_id = section.shop_id
section_id = section.id
serving_table_id = section.serving_table.id
range = 1..i

Cover.insert_all(
  range.map do |i|
    { shop_id: shop_id, section_id: section_id, serving_table_id: serving_table_id, name: i }
  end
)

小心语句回滚,万一无效。

© www.soinside.com 2019 - 2024. All rights reserved.