Il bug di performance più comune in Rails è il problema N+1: una query per prendere la lista, più una query per ogni elemento. Con 100 lanci, 101 query.

# MALE: 1 query per i lanci + N query per i provider
Launch.limit(100).each do |launch|
  puts launch.provider.name   # <- una query a ogni giro!
end

# BENE: 2 query in totale
Launch.includes(:provider).limit(100).each do |launch|
  puts launch.provider.name   # provider gia' caricato
end

includes dice a Rails di caricare in anticipo le associazioni (eager loading): fa una query per i lanci e una sola per tutti i provider, invece di N.

Il problema è insidioso perché in sviluppo, con pochi dati, non lo noti; in produzione, con migliaia di righe, la pagina crolla. Strumenti come il gem bullet te lo segnalano in tempo reale.

Regola: ogni volta che in un ciclo accedi a un'associazione, chiediti se serve un includes. Due query battono sempre centouno.