class ActiveModel::Serializer::Associations::HasOne

:nodoc:

def embed_key

def embed_key
  if key = option(:embed_key)
    key
  else
    :id
  end
end

def embeddable?

:nodoc:
def embeddable?
  if polymorphic? && associated_object.nil?
    false
  else
    true
  end
end

def key

def key
  if key = option(:key)
    key
  elsif embed_ids? && !polymorphic?
    "#{@name}_id".to_sym
  else
    @name
  end
end

def polymorphic?

def polymorphic?
  option :polymorphic
end

def polymorphic_key

def polymorphic_key
  associated_object.class.to_s.demodulize.underscore.to_sym
end

def root

def root
  if root = option(:root)
    root
  elsif polymorphic?
    associated_object.class.to_s.pluralize.demodulize.underscore.to_sym
  else
    @name.to_s.pluralize.to_sym
  end
end

def serializables

def serializables
  object = associated_object
  value = object && find_serializable(object)
  value ? [value] : []
end

def serialize

def serialize
  object = associated_object
  if object && polymorphic?
    {
      :type => polymorphic_key,
      polymorphic_key => find_serializable(object).serializable_hash
    }
  elsif object
    find_serializable(object).serializable_hash
  end
end

def serialize_ids

def serialize_ids
  id_key = "#{@name}_id".to_sym
  if polymorphic?
    if associated_object
      {
        :type => polymorphic_key,
        :id => associated_object.read_attribute_for_serialization(embed_key)
      }
    else
      nil
    end
  elsif !option(:embed_key) && !source_serializer.respond_to?(@name.to_s) && source_serializer.object.respond_to?(id_key)
    source_serializer.object.read_attribute_for_serialization(id_key)
  elsif associated_object
    associated_object.read_attribute_for_serialization(embed_key)
  else
    nil
  end
end