Ho un codice che sta generando un problema di query sul database N + 1.Rails 4: piccolo problema N + 1 per pagina non collegata
Il problema si verifica solo se la pagina è scollegata. Una volta che la pagina è stata memorizzata nella cache, l'aggiunta di uno .includes
comporta effettivamente una chiamata al database non necessaria. Mi sto chiedendo come ovviare a questo problema.
mia applicaiton_helper.rb contiene quanto segue:
module ApplicationHelper
def by(article)
"By #{article.username} on #{article.created_at.strftime('%B %e, %Y')}"
end
end
mia article.rb contiene:
class Article < ActiveRecord::Base
belongs_to :user
def username
user.username
end
end
e la mia articles_controller.rb contiene:
class ArticlesController < ApplicationController
def index
@articles = user_signed_in? ? Article.all : Article.all.published.limit(13)
end
end
Il metodo in questione è il metodo username
, che effettua una chiamata al modello Utente. Come già detto, quando la pagina non è già stata memorizzata nella cache, ciò comporta il metodo helper by(article)
per effettuare chiamate continue al modello User senza alcun caricamento eccessivo. Tuttavia, poiché memorizzo nella cache le mie opinioni, questa inefficienza si verifica solo una volta. Se cambio il mio articles_controller.rb al seguente:
class ArticlesController < ApplicationController
def index
@articles = user_signed_in? ? Article.all.includes(:user) : Article.all.published.limit(13).includes(:user)
end
end
il problema N + 1 scompare al primo caricamento della pagina, ma poi ho ottenere un inutile .includes
su di ricaricare la pagina.
Qualche idea su come posso risolvere questo piccolo problema?
Grazie!
Questo non ha senso. 'includes' dovrebbe usare una query per caricare gli utenti. Probabilmente sta succedendo qualcos'altro. Stai abilitando la memorizzazione nella cache in fase di sviluppo per testare questo? – Mohamad
Mi sembra che sia la chiamata "article.username" a causare la ricerca nel modello tramite una richiesta aggiuntiva. – jbehrens94
@Mohamad Ho appena disabilitato il caching nello sviluppo. Ora ricevo costantemente un messaggio da Bullet che dice '' 'N + 1 query rilevata Articolo => [: utente] Aggiungi al tuo finder:: includes => [: user] N + 1 Stack di chiamate con metodo di query ~ /myapp/app/models/article.rb:64:in 'username'''' – DaniG2k