Mam pewien kod, który generuje problem z bazą danych N + 1.Rails 4: mały problem N + 1 dla strony bez zawartości
Problem pojawia się tylko wtedy, gdy strona jest w pamięci podręcznej. Gdy strona zostanie zapisana w pamięci podręcznej, dodanie wartości .includes
spowoduje niepotrzebne wywołanie bazy danych. Zastanawiam się, jak obejść ten problem.
mój applicaiton_helper.rb zawiera następujące elementy:
module ApplicationHelper
def by(article)
"By #{article.username} on #{article.created_at.strftime('%B %e, %Y')}"
end
end
mój article.rb zawiera:
class Article < ActiveRecord::Base
belongs_to :user
def username
user.username
end
end
i mój articles_controller.rb zawiera:
class ArticlesController < ApplicationController
def index
@articles = user_signed_in? ? Article.all : Article.all.published.limit(13)
end
end
Metodą, o której mowa, jest metoda username
, która wywołuje model użytkownika. Jak wspomniano powyżej, gdy strona nie została jeszcze buforowana, powoduje to, że metoda pomocnika by(article)
wywołuje ciągłe wywołania do modelu użytkownika bez nadmiernego ładowania. Ponieważ jednak buforuję swoje opinie, ta nieefektywność występuje tylko raz. Jeśli zmienię mojego articles_controller.rb na następujące kwestie:
class ArticlesController < ApplicationController
def index
@articles = user_signed_in? ? Article.all.includes(:user) : Article.all.published.limit(13).includes(:user)
end
end
N + 1 problem znika na pierwszej stronie obciążenia, ale potem pojawia się niepotrzebnego .includes
na przeładowania strony.
Każdy pomysł, jak mogę naprawić ten mały błąd?
Dzięki!
To nie pasuje do zmysłu. 'includes' powinno użyć jednego zapytania, aby załadować użytkowników. Coś innego prawdopodobnie się dzieje. Czy włączenie testowania pamięci podręcznej umożliwia testowanie tego? – Mohamad
Mam wrażenie, że jest to wywołanie 'article.username', powodujące to wyszukiwanie w modelu za pomocą dodatkowego żądania. – jbehrens94
@Mohamad Właśnie wyłączyłem buforowanie w rozwoju. Teraz ciągle otrzymuję wiadomość od Bulleta mówiąc: '' 'Zapytanie N + 1 wykryte Artykuł => [: użytkownik] Dodaj do wyszukiwarki:: zawiera => [: użytkownik] N + 1 Stos wywołań metod zapytania ~ /mojapp/app/models/article.rb:64:in 'username''''' – DaniG2k