module ViewModel::ActiveRecord::AssociationManipulation

def load_associated(association_name, scope: nil, eager_include: true, serialize_context: self.class.new_serialize_context)

def load_associated(association_name, scope: nil, eager_include: true, serialize_context: self.class.new_serialize_context)
  association_data = self.class._association_data(association_name)
  direct_reflection = association_data.direct_reflection
  association = self.model.association(direct_reflection.name)
  association_scope = association.scope
  if association_data.through?
    raise ArgumentError.new('Polymorphic through relationships not supported yet') if association_data.polymorphic?
    associated_viewmodel = association_data.viewmodel_class
    direct_viewmodel     = association_data.direct_viewmodel
  else
    raise ArgumentError.new('Polymorphic STI relationships not supported yet') if association_data.polymorphic?
    associated_viewmodel = association.klass.try { |k| association_data.viewmodel_class_for_model!(k) }
    direct_viewmodel     = associated_viewmodel
  end
  if association_data.ordered?
    association_scope = association_scope.order(direct_viewmodel._list_attribute_name)
  end
  if association_data.through?
    association_scope = associated_viewmodel.model_class
                          .joins(association_data.indirect_reflection.inverse_of.name)
                          .merge(association_scope)
  end
  association_scope = association_scope.merge(scope) if scope
  vms = association_scope.map { |model| associated_viewmodel.new(model) }
  ViewModel.preload_for_serialization(vms) if eager_include
  if association_data.collection?
    vms
  else
    if vms.size > 1
      raise ViewModel::DeserializationError::Internal.new("Internal error: encountered multiple records for single association #{association_name}", self.blame_reference)
    end
    vms.first
  end
end