我有一些代碼正在生成N + 1數據庫查詢問題。Rails 4:未緩存頁面的小N + 1問題
只有頁面未被高速緩存時纔會出現此問題。一旦頁面被緩存,添加一個.includes
實際上會導致不必要的數據庫調用。我想知道如何解決這個問題。
我applicaiton_helper.rb包含以下內容:
module ApplicationHelper
def by(article)
"By #{article.username} on #{article.created_at.strftime('%B %e, %Y')}"
end
end
我article.rb包含:
class Article < ActiveRecord::Base
belongs_to :user
def username
user.username
end
end
和我articles_controller.rb包含:
class ArticlesController < ApplicationController
def index
@articles = user_signed_in? ? Article.all : Article.all.published.limit(13)
end
end
有問題的方法是username
方法,該方法調用User模型。如前所述,當頁面尚未被緩存時,這會導致by(article)
幫助程序方法在沒有任何預先加載的情況下連續調用用戶模型。但是,由於我緩存了我的觀點,所以這種低效率只發生一次。如果我改變我的articles_controller.rb以下幾點:
class ArticlesController < ApplicationController
def index
@articles = user_signed_in? ? Article.all.includes(:user) : Article.all.published.limit(13).includes(:user)
end
end
的N + 1問題第一個頁面加載消失了,但後來我在重新加載頁面得到一個不必要的.includes
。
任何想法如何我可以解決這個小毛刺?
謝謝!
這並不真正配合意義。 'includes'應該使用一個查詢來加載用戶。其他事情可能正在發生。你在開發中啓用緩存來測試它嗎? – Mohamad
我覺得這是'article.username'調用,通過一個額外的請求在模型中查找它。 – jbehrens94
@Mohamad我剛開發時禁用了緩存。我現在一直從Bullet收到一條消息,說 '''N + 1查詢檢測到 Article => [:user] 加入您的查找器::includes => [:user] N + 1查詢方法調用堆棧 〜 /myapp/app/models/article.rb:64:in'username'''' – DaniG2k