Я работаю с API, который предоставляет данные о прибытии автобусов. Для каждого запроса я получаю обратно (среди прочего) список маршрутов, которые обслуживают данную остановку. Например, если в список включены результаты для автобусных маршрутов № 1, 2 и 5, то я знаю, что они служат этой остановке.
У меня установлено отношение «многие ко многим» между Route и Stop, и я хочу динамически проверять и обновлять эти ассоциации при каждом запросе. Не существует «главного списка» маршрутов, которые останавливаются, поэтому это лучший способ получить эти данные.
Я считаю, что то, как я это делаю сейчас, очень неэффективно:
# routes is an array of [number, destination] that I build while iterating over the data
routes.uniq.each do |route|
number = route[0]
destination = route[1]
r = Route.find_by_number_and_destination(number, destination)
if !r
r = Route.new :number => number, :destination => destination
r.save
end
# I have to check if it already exists because I can't find a way
# to create a uniqueness constraint on the join table with 2 foreign keys
r.stops << stop unless r.stops.include? stop
end
По сути, я должен сделать 2 вещи для каждого найденного маршрута:
1) Создайте его, если он еще не существует, 2) Добавьте отношение к текущей остановке, если он еще не существует.
Есть ли лучший способ сделать это, например, получить кучу данных в памяти и выполнить некоторую обработку на стороне сервера приложений, чтобы избежать множества обращений к базе данных, которые я сейчас выполняю?