У меня есть модель, которую я пытаюсь фильтровать по нескольким столбцам (некоторые могут отсутствовать в фильтре), и я пытаюсь ускорить этот запрос.Самый быстрый способ фильтрации коллекции в 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
Пытаясь выяснить, самый быстрый способ сделать это. Также хотите добавить результаты в кеш, связанный с конкатенацией переданных параметров, что имеет смысл добавить? Кэш будет работать только с последующими фильтрами, но не с исходными.
Благодаря
Как долго длится запрос, и как долго вы думаете, что он должен принять? Что такое вывод EXPLAIN? –
С 350 вещами запрос занимает ~ 580 мс. О, интересно, похоже на его только 40 мс в активной записи, но 500 мс в рендеринге json :( –
Не грусти - всегда хорошо, когда ты понимаешь свою проблему лучше, чем раньше! К счастью, [многое было написано] (https : //www.google.com/search? q = speed + up + rails + json + rendering) об ускорении рендеринга JSON в Rails. (Просто убедитесь, что любые рекомендации, которые вы берете, все еще применяются к Rails 4.) –