Sha256: 14d63f672f16bbfa15a4a506e39e64ab502cd8922e4b5b7a4db249e5f49d311d

Contents?: true

Size: 1.04 KB

Versions: 2

Compression:

Stored size: 1.04 KB

Contents

require "active_model_serializers"

# This is a generic serializer intended to return a subset of a model's attributes.
# It can be used with any model but does not currently support associations.
#
# Example usage:
#   `render json: @region, serializer: FieldSerializer, fields: [:id, :title]`
#
#   > { "id": "5f19582d-ee28-4e89-9e3a-edc42a8b59e5", "title": "London" }

class FieldSerializer < ActiveModel::Serializer
  def attributes(*args)
    adding_id do
      merging_attributes do
        args.first.map { |field| create_attribute_structure(field.split("."), object) }
      end
    end
  end

  private

  def adding_id(&block)
    block.call.merge(id: object.id)
  end

  def create_attribute_structure(attribute_stack, model)
    parent = attribute_stack.shift
    if attribute_stack.count > 0
      nested_model = model.send(parent)
      { parent => create_attribute_structure(attribute_stack, nested_model) }
    else
      { parent => model.send(parent) }
    end
  end

  def merging_attributes(&block)
    block.call.inject(:deep_merge!)
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
fields-serializer-0.1.1 lib/fields/serializer/field_serializer.rb
fields-serializer-0.1.0 lib/fields/serializer/field_serializer.rb