Pré-busca de associações para instâncias de modelo existentes

A maioria de nós saberá e usará frequentemente:

Model.includes(:another_model, :yet_another_model, some_model_with: :associated_models).all

Mas e se (por exemplo, fora de um cache ou uma consulta de junção complicada) você já tem instâncias de modelo e agora deseja pré-buscar suas associações correspondentes?

Existe uma maneira fácil de fazer isso:

ActiveRecord::Associations::Preloader.new(objects, [:another_model, :yet_another_model, some_model_with: :associated_models]).run

Isso irá “armazenar em cache” os objetos associados dentro dos objetos. O importante aqui é que ele usará uma consulta por tipo de modelo para pré-buscar todos os objetos.

Então, é isso:

objects.each{|o| o.another_model.do_something }

não resultará em uma consulta por iteração.