我有一些代码生成N + 1数据库查询问题.
只有在未缓存页面时才会出现此问题.页面缓存后,添加.includes实际会导致不必要的数据库调用.我想知道如何解决这个问题.
我的applicaiton_helper.rb包含以下内容:
module ApplicationHelper
def by(article)
"By #{article.username} on #{article.created_at.strftime('%B %e, %Y')}"
end
end
Run Code Online (Sandbox Code Playgroud)
我的article.rb包含:
class Article < ActiveRecord::Base
belongs_to :user
def username
user.username
end
end
Run Code Online (Sandbox Code Playgroud)
而我的articles_controller.rb包含:
class ArticlesController < ApplicationController
def index
@articles = user_signed_in? ? Article.all : Article.all.published.limit(13)
end
end
Run Code Online (Sandbox Code Playgroud)
有问题的username方法是调用User模型的方法.如前所述,当页面尚未缓存时,这会导致by(article)辅助方法连续调用User模型而不需要任何预先加载.但是,由于我正在缓存我的观点,这种低效只会发生一次.如果我将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
Run Code Online (Sandbox Code Playgroud)
N + 1问题在第一页加载时消失,但是.includes在重新加载页面时我得到了一个不必要的东西.
知道如何解决这个小故障吗?
谢谢!
不知何故,这解决了我的问题:
class Article < ActiveRecord::Base
belongs_to :user
delegate :username, to: :user
end
Run Code Online (Sandbox Code Playgroud)
因此,我只是将对文章的用户名调用委托给用户模型。美丽、干净并且有效:子弹不再抱怨。
| 归档时间: |
|
| 查看次数: |
633 次 |
| 最近记录: |