在循环内创建多个对象的控制器操作是 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 查询检测,不是对集合的查询,
includes
将不适用。
在这种情况下如何避免 N+1 查询?
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
)
小心语句回滚,万一无效。