4

當前我正在處理一個大型Web應用程序並使其工作更快我決定重構所有N + 1個查詢(以減少對數據庫的請求數,http://rails-bestpractices.com/posts/29-fix-n-1-queries)。所以我安裝了現在不支持Rails 3.1.1的寶石「bullet」(你可以使用https://github.com/flyerhzm/bullet的分支)。當每一頁上使用declarative_authorization寶石,我得到同樣的警告:使用gem「bullet」修復「declarative_authorization」gem中的N + 1查詢

N+1 Query detected 
    Role => [:permissions] 
    Add to your finder: :include => [:permissions] 

N+1 Query detected 
    Permission => [:permission_rules] 
    Add to your finder: :include => [:permission_rules] 

CACHE (0.0ms) SELECT "roles".* FROM "roles" 
    CACHE (0.0ms) SELECT "permissions".* FROM "permissions" WHERE "permissions"."role_id" = 1 
    CACHE (0.0ms) SELECT "permissions".* FROM "permissions" WHERE "permissions"."role_id" = 2 
    CACHE (0.0ms) SELECT "permissions".* FROM "permissions" WHERE "permissions"."role_id" = 3 
    CACHE (0.0ms) SELECT "permissions".* FROM "permissions" WHERE "permissions"."role_id" = 4 
    CACHE (0.0ms) SELECT "permissions".* FROM "permissions" WHERE "permissions"."role_id" = 6 
    CACHE (0.0ms) SELECT "permissions".* FROM "permissions" WHERE "permissions"."role_id" = 7 
    CACHE (0.0ms) SELECT "permissions".* FROM "permissions" WHERE "permissions"."role_id" = 8 
    CACHE (0.0ms) SELECT "permission_rules".* FROM "permission_rules" INNER JOIN "permission_rules_permissions" ON "permission_rules"."id" = "permission_rules_permissions"."permission_rule_id" WHERE "permission_rules_permissions"."permission_id" = 30 
    CACHE (0.0ms) SELECT "permission_rules".* FROM "permission_rules" INNER JOIN "permission_rules_permissions" ON "permission_rules"."id" = "permission_rules_permissions"."permission_rule_id" WHERE "permission_rules_permissions"."permission_id" = 31 

... 

能否請你幫我與和使這個查詢更快?

+0

你能發佈導致這些警告的Rails應用程序的實際代碼嗎? – Tilo

回答

2

我會刪除寶石,但在兩個模型的每一箇中添加:include s。

+2

邁克爾是絕對正確的,我只是沒有注意到「config」目錄中的幾個文件,在那裏加載規則,所以是,我只是添加包括(:permission_rules)user_role.permissions,它現在很好!我建議你通過codeschool.com Rails最佳實踐,在第4課中有對N + 1查詢的一個很好的解釋。 – makaroni4

+1

+1 mararoni4 - 我(已經完成)認爲Code School真棒! –