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

Attributes

already_loaded_records_by_key[R]
keys_to_load[R]
loader_query[R]
loaders[R]

Public Class Methods

new(loaders, loader_query) click to toggle source
# File lib/active_record/associations/preloader/association.rb, line 44
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

Public Instance Methods

records() click to toggle source
# File lib/active_record/associations/preloader/association.rb, line 53
def records
  load_records + already_loaded_records
end

Private Instance Methods

already_loaded_records() click to toggle source
# File lib/active_record/associations/preloader/association.rb, line 80
def already_loaded_records
  already_loaded_records_by_key.values.flatten
end
load_records() click to toggle source
# File lib/active_record/associations/preloader/association.rb, line 74
def load_records
  loader_query.load_records_for_keys(keys_to_load) do |record|
    loaders.each { |l| l.set_inverse(record) }
  end
end
populate_keys_to_load_and_already_loaded_records() click to toggle source
# File lib/active_record/associations/preloader/association.rb, line 60
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