[英]How to avoid N+1 queries in Rails
我在控制器中有以下要求:
def show
@statistics = Keyword.find(params[:id]).statistics.order(:word).paginate :per_page => 10, :page => params[:page]
end
在視圖文件的一個位置,我請求一個緩存id參數:
<td><%= link_to "Open", cache_path(stats.cache.id), :target => "_blank" %></td>
產生N + 1個查詢,如下所示:
Parameters: {"id"=>"1"}
Keyword Load (0.5ms) SELECT "keywords".* FROM "keywords" WHERE "keywords"."id" = $1 LIMIT 1 [["id", 1]]
(0.4ms) SELECT COUNT(*) FROM "statistics" WHERE "statistics"."keyword_id" = $1 [["keyword_id", 1]]
Statistic Load (0.4ms) SELECT "statistics".* FROM "statistics" WHERE "statistics"."keyword_id" = $1 ORDER BY "statistics"."word" ASC LIMIT 10 OFFSET 0 [["keyword_id", 1]]
Cache Load (0.5ms) SELECT "caches".* FROM "caches" WHERE "caches"."statistic_id" = $1 LIMIT 1 [["statistic_id", 5]]
Cache Load (0.6ms) SELECT "caches".* FROM "caches" WHERE "caches"."statistic_id" = $1 LIMIT 1 [["statistic_id", 4]]
Cache Load (0.5ms) SELECT "caches".* FROM "caches" WHERE "caches"."statistic_id" = $1 LIMIT 1 [["statistic_id", 3]]
Cache Load (0.7ms) SELECT "caches".* FROM "caches" WHERE "caches"."statistic_id" = $1 LIMIT 1 [["statistic_id", 2]]
Cache Load (0.5ms) SELECT "caches".* FROM "caches" WHERE "caches"."statistic_id" = $1 LIMIT 1 [["statistic_id", 1]]
Rendered statistics/show.html.erb within layouts/application (13.7ms)
有什么辦法可以避免呢?
編輯
ActiveRecord有一個名為include的方法,該方法可確保以最少的查詢次數加載所有指定的關聯數據。
def show
@keyword = Keyword.find(params[:id])
@statistics = @keyword.statistics.includes(:cache).order("statistics.word").paginate :per_page => 10, :page => params[:page]
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.