class ActiveModelSerializersPg::CollectionSerializer

Attributes

object[R]
options[R]
root[R]

Public Class Methods

new(resources, options = {}) click to toggle source
# File lib/active_model_serializers_pg/collection_serializer.rb, line 22
def initialize(resources, options = {})
  @object                  = resources
  @options                 = options
  @root                    = options[:root]
  # PATCHED: We don't want to materialize a Relation by iterating unless we have to.
  # On the other hand, if we don't have a serializer we *do* want to `throw :no_serializer`
  # right away. That should only happen for basic types (like a String or Hash),
  # so we act lazy when we have a Relation, and eager otherwise:
  unless resources.is_a? ActiveRecord::Relation
    @serializers = serializers_from_resources
  end
end

Public Instance Methods

element_serializer() click to toggle source

PATCH: Give ourselves access to the serializer for the individual elements:

# File lib/active_model_serializers_pg/collection_serializer.rb, line 36
def element_serializer
  options[:serializer]
end
json_key() click to toggle source

TODO: unify naming of root, json_key, and _type. Right now, a serializer's json_key comes from the root option or the object's model name, by default. But, if a dev defines a custom `json_key` method with an explicit value, we have no simple way to know that it is safe to call that instance method. (which is really a class property at this point, anyhow). rubocop:disable Metrics/CyclomaticComplexity Disabling cop since it's good to highlight the complexity of this method by including all the logic right here.

# File lib/active_model_serializers_pg/collection_serializer.rb, line 61
def json_key
  return root if root
  # 1. get from options[:serializer] for empty resource collection
  key = object.empty? &&
    (explicit_serializer_class = options[:serializer]) &&
    explicit_serializer_class._type
  # 2. get from first serializer instance in collection
  key ||= (serializer = serializers.first) && serializer.json_key
  # 3. get from collection name, if a named collection
  key ||= object.respond_to?(:name) ? object.name && object.name.underscore : nil
  # 4. key may be nil for empty collection and no serializer option
  key &&= key.pluralize
  # 5. fail if the key cannot be determined
  key || fail(ArgumentError, 'Cannot infer root key from collection type. Please specify the root or each_serializer option, or render a JSON String')
end
paginated?() click to toggle source

rubocop:enable Metrics/CyclomaticComplexity

# File lib/active_model_serializers_pg/collection_serializer.rb, line 78
def paginated?
  ActiveModelSerializers.config.jsonapi_pagination_links_enabled &&
    object.respond_to?(:current_page) &&
    object.respond_to?(:total_pages) &&
    object.respond_to?(:size)
end
serializable_hash(adapter_options, options, adapter_instance) click to toggle source

@api private

# File lib/active_model_serializers_pg/collection_serializer.rb, line 45
def serializable_hash(adapter_options, options, adapter_instance)
  options[:include_directive] ||= ActiveModel::Serializer.include_directive_from_options(adapter_options)
  options[:cached_attributes] ||= ActiveModel::Serializer.cache_read_multi(self, adapter_instance, options[:include_directive])
  serializers.map do |serializer|
    serializer.serializable_hash(adapter_options, options, adapter_instance)
  end
end
success?() click to toggle source
# File lib/active_model_serializers_pg/collection_serializer.rb, line 40
def success?
  true
end

Protected Instance Methods

serializers() click to toggle source
# File lib/active_model_serializers_pg/collection_serializer.rb, line 89
def serializers
  @serializers ||= serializers_from_resources
end

Private Instance Methods

serializer_from_resource(resource, serializer_context_class, options) click to toggle source
# File lib/active_model_serializers_pg/collection_serializer.rb, line 102
def serializer_from_resource(resource, serializer_context_class, options)
  serializer_class = options.fetch(:serializer) do
    serializer_context_class.serializer_for(resource, namespace: options[:namespace])
  end

  if serializer_class.nil?
    ActiveModelSerializers.logger.debug "No serializer found for resource: #{resource.inspect}"
    throw :no_serializer
  else
    serializer_class.new(resource, options.except(:serializer))
  end
end
serializers_from_resources() click to toggle source
# File lib/active_model_serializers_pg/collection_serializer.rb, line 95
def serializers_from_resources
  serializer_context_class = options.fetch(:serializer_context_class, ActiveModel::Serializer)
  object.map do |resource|
    serializer_from_resource(resource, serializer_context_class, options)
  end
end