4

현재 하나의 큰 웹 응용 프로그램에서 작업 중이며 빠르게 작동하도록 모든 N + 1 쿼리를 리팩터링하기로 결정했습니다 (데이터베이스 요청 수를 줄이기 위해). , http://rails-bestpractices.com/posts/29-fix-n-1-queries). 그래서 저는 지금 Rails 3.1.1에서 작동하지 않는 보석 "총알"을 설치했습니다 (당신은 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을 추가합니다.

+2

Michael은 절대적으로 옳았습니다. 규칙이로드 된 "config"디렉토리에서 몇 개의 파일을 발견하지 못했습니다. user_role.permissions에 include (: permission_rules)를 추가하면 바로 지금 작동합니다! 나는 codeschool.com Rails Best Practices를 통과 할 것을 권한다. 레슨 4에서 N + 1 쿼리에 대한 멋진 설명이있다. – makaroni4

+1

+1 mararoni4 - 나는 (코드를 완성했다.) 코드 스쿨이 굉장하다고 생각한다! –