class ActiveRecord::Associations::Preloader::Association::LoaderRecords

def already_loaded_records

def already_loaded_records
  already_loaded_records_by_key.values.flatten
end

def initialize(loaders, loader_query)

def initialize(loaders, loader_query)
  @loader_query = loader_query
  @loaders = loaders
  @keys_to_load = Set.new
  @already_loaded_records_by_key = {}
  populate_keys_to_load_and_already_loaded_records
end

def load_records

def load_records
  loader_query.load_records_for_keys(keys_to_load) do |record|
    loaders.each { |l| l.set_inverse(record) }
  end
end

def populate_keys_to_load_and_already_loaded_records

def populate_keys_to_load_and_already_loaded_records
  loaders.each do |loader|
    loader.owners_by_key.each do |key, owners|
      if loaded_owner = owners.find { |owner| loader.loaded?(owner) }
        already_loaded_records_by_key[key] = loader.target_for(loaded_owner)
      else
        keys_to_load << key
      end
    end
  end
  @keys_to_load.subtract(already_loaded_records_by_key.keys)
end

def records

def records
  load_records + already_loaded_records
end