Общее время запросов можно сократить если скачивать данные с источника асинхронно, при помощи Thread. Здесь есть примеры:
ruby-doc.com/docs/ProgrammingRuby/html/tut_threads.html
Сохранять можно по-разному. Это зависит от постановки задачи, которая не указана.
Не могу подказать как оптимизировать код поскольку он не указан.
UPD
Если асинхронного скачивания недостаточно для оптимизации, то напрашивается другой способ:
вместо скачивания о складах каждый раз в экшене контроллера, особенно если их размер существеннен и сторонний API небыстро возвращает данные, лучше создать Rake task для периодического обновления данных о складах через определённый промужуток времени. Таким образом, контроллер будет брать заранее сохранённые данные из БД, экономя время на повторное скачивание данных.
Как именно сохранять данные определяется исходя из требуемой структуры данных.
Допустим, можно хранить данные в РСУБД так (если я верно понял задачу):
id | city_id (integer) | code (string/integer) | warehouse_data (text)
Помимо прочего, для часто повторяющихся запросов данные можно брать прямо с
кеша. Статистику обращений можно получить путём анализа лога запросов.
Подытожив:
- создать Rake task, в которой нужно пройтись по всем возможным городам и кодам, сохраня данные в СУБД
- контроллер будет брать готовые данные с БД
- кешировать данные согласно параметрам запроса. Ну и, возможно, более продвинутая часть, чтобы было совсем как по науке: Википедия: Алгоритмы кэширования