Ruby · Intermediário · Português · Técnico
N mais um
Problema de desempenho em que uma consulta traz N registros e cada um dispara outra para um dado associado, totalizando N+1 idas ao banco. Resolve-se com includes.
Onde usar
Aparece em listagens que acessam associações dentro de um laço ou de uma view e se revela nos logs como dezenas de SELECTs iguais. Ferramentas como Bullet ajudam a detectar.
Em código
# N+1: uma consulta por autor
Livro.all.each { |l| puts l.autor.nome }
# resolvido com includes
Livro.includes(:autor).each do |l|
puts l.autor.nome
endExemplos
Esse laço tem um N mais um: cada livro consulta o autor.
Resolvi o N mais um com includes.
Cuidado
Não use includes por reflexo: ele carrega tudo que foi pedido, mesmo sem uso. Carregue só o que a tela exibe.
Sinônimos
N+1
Antônimos
eager loading