2011-10-18 2 views
0

레일스 애플리케이션에서 컨트롤러 작업의 성능을 향상시키고 자합니다. 몇 가지 성능 카운터를 살펴본 후에 모델 코드 전체에 걸쳐 여러 권한 부여 검사가 진행되는 방식에 문제가 있음을 알게되었습니다. 그들은 같은 것을 보면 우리가 some_method 유사한 검사를 할 장소의 무리가 있기 때문에레일 모델에서 권한 확인 성능 향상

Class Company < ActiveRecord::Base 
def member?(user) 
    #look up a table to check for membership if @is_member does not exist else return @is_member 
end 

def employee?(user) 
    #look up a table to check for membership 
end  

def manager?(user) 
    #look up a table to check for membership 
end 
end 

class SomeModel < ActiveRecord::Base 
def some_method 
    do_something if current_company.employee?(current_user) 
end 
end 

을 요청은 일반적으로 데이터베이스에게 시간을 많이 치는 끝. 이것은 일을 낭비하는 것처럼 보입니다. 그러한 권한 확인을 가속화하는 방법은 무엇입니까? 권한이 거의 변화하지 않기 때문에

답변

0

(즉, 캐싱을 가정하면 여기 방법입니다), 그리고 당신은 수, 당신이 고려하는 회원의 유한 목록이 나타납니다

  • 은의 사용자 데이터베이스에 컬럼을 추가
  • 가 역할 모델에 콜백을 만드는 각 역할은 사용자

그 방법에 대한 구성원을 계산하는 역할을 저장할 때 당신은 한 번만 구성원을 계산합니다. 다른 모든 것은 간단한/빠른 열 조회입니다.

+0

이 방법은 (내가 제대로 이해한다면) 내 경우에는 작동하지 않을 것입니다. 왜냐하면 멤버십 목록은 유한하지만 동적입니다. 사용자는 잠재적으로 많은 수의 회사 회원이 될 수 있습니다. 현재 구현은 여전히 ​​사용자와 회사를 매핑하고 멤버십 수준을 나타내는 역할 마스크가있는 연관 테이블에서 매우 빠른 단일 테이블 조회입니다. 나는이 멤버쉽 체크가 요청마다 여러 번 호출되고 멤버십이 실제로 시간이 지남에 따라 변하지 않기 때문에 DB를 치는 것을 효과적으로 피하는 방법을 찾고 있습니다. –