class ApiMaker::CollectionSerializer

Public Class Methods

new(ability: nil, args: {}, collection:, include_param:, select: nil) click to toggle source
# File lib/api_maker/collection_serializer.rb, line 2
def initialize(ability: nil, args: {}, collection:, include_param:, select: nil)
  @ability = ability || ApiMaker::Ability.new(args: args)
  @args = args
  @collection = collection
  @include_param = include_param
  @select = select
end

Public Instance Methods

as_json(options = nil) click to toggle source
# File lib/api_maker/collection_serializer.rb, line 43
def as_json(options = nil)
  result.as_json(options)
end
preload_collection(data, records) click to toggle source
# File lib/api_maker/collection_serializer.rb, line 47
def preload_collection(data, records)
  ApiMaker::Configuration.profile("CollectionSerializer result preloading") do
    preloader = ApiMaker::Preloader.new(
      ability: @ability,
      args: @args,
      collection: @collection,
      data: data,
      include_param: @include_param,
      records: records,
      select: @select
    )
    preloader.fill_data
  end
end
result() click to toggle source
# File lib/api_maker/collection_serializer.rb, line 10
def result
  @result ||= begin
    data = {
      data: {},
      included: {}
    }

    records = {}

    ApiMaker::Configuration.profile("CollectionSerializer result collection map") do
      @collection.map do |model|
        serializer = ApiMaker::Serializer.new(ability: @ability, args: @args, model: model, select: select_for(model))
        resource = serializer.resource
        collection_name = resource.collection_name
        id = model.id

        data.fetch(:included)[collection_name] ||= {}
        data.fetch(:included)[collection_name][id] ||= serializer

        data.fetch(:data)[collection_name] ||= []
        data.fetch(:data)[collection_name] << id

        records[collection_name] ||= {}
        records[collection_name][id] ||= serializer
      end
    end

    preload_collection(data, records) if @collection.length.positive?

    data
  end
end
select_for(model) click to toggle source
# File lib/api_maker/collection_serializer.rb, line 62
def select_for(model)
  @select&.dig(model.class)
end
to_json(options = nil) click to toggle source
# File lib/api_maker/collection_serializer.rb, line 66
def to_json(options = nil)
  JSON.generate(as_json(options))
end