2014-09-26 2 views
0

여러 개의 열로 필터링하려고하는 모델이 있는데 (일부는 필터에 없을 수도 있음)이 쿼리의 속도를 높이려고합니다. 나는이 인덱스를 추가 한루비 레일 컬렉션을 필터링하는 가장 빠른 방법

def index 
    @things = Thing.accessible_by(current_ability) 

    if params.has_key?(:color) 
     @things = @things.where(:color => params[:color]) 
    end 

    if params.has_key?(:weight) 
     @things = @things.where(:weight => params[:weight]) 
    end 

    if params.has_key?(:size) 
     @things = @things.where(:size => params[:size]) 
    end 

    @things = @things.order(:updated_at).page(params[:page]).per(params[:per_page]) 

end 

:

add_index :things, :color 
add_index :things, :weight 
add_index :things, :size 

이 작업을 수행하는 가장 빠른 방법을 알아 내려고 여기

컨트롤러의 색인 방법의 조각입니다. 또한 전달 된 매개 변수를 연결하여 캐시에 결과를 추가하고 싶다면 추가하는 것이 합당합니까? 캐시는 초기 필터가 아닌 후속 필터에만 도움이됩니다.

감사

+0

쿼리를 수행하는 데 걸리는 시간과 소요 시간은 어느 정도입니까? 'EXPLAIN' 결과는 무엇입니까? –

+0

350 개 쿼리의 경우 ~ 580ms가 소요됩니다. 오, 흥미 롭습니다. 활발한 기록에서 40ms 밖에 보이지 않지만 json을 렌더링하는 데 500ms가 걸립니다. ( –

+0

슬프게하지 마세요. 이전에했던 것보다 문제를 더 잘 이해하면 언제나 좋습니다! (많이 쓰여졌습니다) (https : //www.google.com/search? q = speed + up + rails + json + rendering) (레일스에서 ​​JSON 렌더링 속도를 높이는 것에 대해) –

답변

0

이 쿼리를 가속화 대해 정말 아니지만, 뭔가가 있다면 도움이 될 것이다, 당신의 의견을 캐싱 고려하는 것이 좋습니다

또한
def index 
    filtered_params = params.select{|x| [:color, :weight, :size].include? x} 
    @things = Thing.accessible_by(current_ability) 
       .where(filtered_params) 
       .order(:updated_at) 
       .page(params[:page]) 
       .per(params[:per_page]) 
end 

액션의 크기를 줄이기 위해 조회수는 그렇게 많이 변하지 않습니다.

관련 문제