2014-09-26 2 views
0

У меня есть модель, которую я пытаюсь фильтровать по нескольким столбцам (некоторые могут отсутствовать в фильтре), и я пытаюсь ускорить этот запрос.Самый быстрый способ фильтрации коллекции в ruby ​​on rails

Вот отрывок из индексного метода контроллера:

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 вещами запрос занимает ~ 580 мс. О, интересно, похоже на его только 40 мс в активной записи, но 500 мс в рендеринге json :( –

+0

Не грусти - всегда хорошо, когда ты понимаешь свою проблему лучше, чем раньше! К счастью, [многое было написано] (https : //www.google.com/search? q = speed + up + rails + json + rendering) об ускорении рендеринга JSON в Rails. (Просто убедитесь, что любые рекомендации, которые вы берете, все еще применяются к Rails 4.) –

ответ

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 

Кроме того, вы можете захотеть рассмотреть кэширование мнения, помог бы, если вашему взгляды не так сильно меняются.