class ActiveAny::Associations::Preloader::Association

Attributes

klass[R]
owners[R]
preload_scope[R]
preloaded_records[R]
reflection[R]

Public Class Methods

new(klass, owner_records, reflection, preload_scope) click to toggle source
# File lib/active_any/associations/preloader/association.rb, line 11
def initialize(klass, owner_records, reflection, preload_scope)
  @klass = klass
  @owners = owner_records
  @reflection = reflection
  @preload_scope = preload_scope
  @preloaded_records = []
end

Public Instance Methods

association_key_name() click to toggle source

The name of the key on the associated records

# File lib/active_any/associations/preloader/association.rb, line 36
def association_key_name
  raise NotImplementedError
end
options() click to toggle source
# File lib/active_any/associations/preloader/association.rb, line 44
def options
  reflection.options
end
owner_key_name() click to toggle source
# File lib/active_any/associations/preloader/association.rb, line 40
def owner_key_name
  raise NotImplementedError
end
preload(_preloader) click to toggle source
# File lib/active_any/associations/preloader/association.rb, line 23
def preload(_preloader)
  raise NotImplementedError
end
records_for(ids) click to toggle source
# File lib/active_any/associations/preloader/association.rb, line 31
def records_for(ids)
  scope.where(association_key_name => ids)
end
run(preloader) click to toggle source
# File lib/active_any/associations/preloader/association.rb, line 19
def run(preloader)
  preload(preloader)
end
scope() click to toggle source
# File lib/active_any/associations/preloader/association.rb, line 27
def scope
  @scope ||= build_scope
end

Private Instance Methods

associated_records_by_owner(_preloader) click to toggle source
# File lib/active_any/associations/preloader/association.rb, line 50
def associated_records_by_owner(_preloader)
  records = load_records do |record|
    owner = owners_by_key[record[association_key_name]]
    association = owner.association(reflection.name)
    association.set_inverse_instance(record)
  end

  owners.each_with_object({}) do |owner, result|
    result[owner] = records[owner[owner_key_name]] || []
  end
end
build_scope() click to toggle source
# File lib/active_any/associations/preloader/association.rb, line 89
def build_scope # rubocop:disable all
  scope = klass.unscoped

  values = reflection_scope.values
  preload_values = preload_scope.values

  scope.where_clause = reflection_scope.where_clause + preload_scope.where_clause
  # scope.references_values = Array(values[:references]) + Array(preload_values[:references])

  if preload_values[:select] || values[:select]
    scope._select!(preload_values[:select] || values[:select])
  end
  scope.includes! preload_values[:includes] || values[:includes]
  # if preload_scope.joins_values.any?
  #   scope.joins!(preload_scope.joins_values)
  # else
  #   scope.joins!(reflection_scope.joins_values)
  # end
  order_values = preload_values[:order] || values[:order]
  scope.order!(order_values) if order_values

  # if preload_values[:reordering] || values[:reordering]
  #   scope.reordering_value = true
  # end

  # if preload_values[:readonly] || values[:readonly]
  #   scope.readonly!
  # end

  # if options[:as]
  #   scope.where!(klass.table_name => { reflection.type => model.base_class.sti_name })
  # end

  # scope.unscope_values = Array(values[:unscope]) + Array(preload_values[:unscope])
  klass.default_scoped.merge(scope)
end
load_records() { |record| ... } click to toggle source
# File lib/active_any/associations/preloader/association.rb, line 74
def load_records
  return {} if owner_keys.empty?
  @preloaded_records = records_for(owner_keys).load
  @preloaded_records.each do |record|
    yield record if block_given?
  end
  @preloaded_records.group_by do |record|
    record[association_key_name]
  end
end
owner_keys() click to toggle source
# File lib/active_any/associations/preloader/association.rb, line 68
def owner_keys
  @owner_keys ||= owners.map do |owner|
    owner[owner_key_name]
  end.uniq.compact
end
owners_by_key() click to toggle source
# File lib/active_any/associations/preloader/association.rb, line 62
def owners_by_key
  @owners_by_key ||= owners.each_with_object({}) do |owner, h|
    h[owner[owner_key_name]] = owner
  end
end
reflection_scope() click to toggle source
# File lib/active_any/associations/preloader/association.rb, line 85
def reflection_scope
  @reflection_scope ||= reflection.scope_for(klass)
end