Ordenar uma matriz de acordo com os elementos de outra matriz

Eu tenho uma matriz de ids

a1 = [1, 2, 3, 4, 5]  

e eu tenho outra matriz de objetos com ids em ordem aleatória

a2 = [(obj_with_id_5), (obj_with_id_2), (obj_with_id_1), (obj_with_id_3), (obj_with_id_4)]  

Agora eu preciso classificar a2 de acordo com a ordem de ids em a1. Então a2 deve agora tornar-se:

[(obj_with_id_1), (id_2), (id_3), (id_4), (id_5)]  

a1 pode ser [3, 2, 5, 4, 1] ou em qualquer ordem, mas a2 deve corresponder à ordem de ids em a1.

Eu gosto disso:

a1.each_with_index do |id, idx|
  found_idx = a1.find_index { |c| c.id == id }
  replace_elem = a2[found_idx]
  a2[found_idx] = a2[idx]
  a2[idx] = replace_elem
end  

Mas isso ainda pode ser executado em um tempo O (n ^ 2) se a ordem dos elementos de a2 for exatamente inversa de a1. Alguém pode me dizer a maneira mais eficiente de classificar a2?

questionAnswers(4)

yourAnswerToTheQuestion