Sha256: 16154998248f88ac1c48acf773dd611b96600a16079c3036be22f50aa83e8c0b

Contents?: true

Size: 1.53 KB

Versions: 32

Compression:

Stored size: 1.53 KB

Contents

module JsonapiCompliable
  # Apply logic when an extra field is requested. Useful for eager loading
  # associations used to compute the extra field.
  #
  # Given a Resource
  #
  #   class PersonResource < ApplicationResource
  #     extra_field :net_worth do |scope|
  #       scope.includes(:assets)
  #     end
  #   end
  #
  # And a corresponding serializer:
  #
  #   class SerializablePerson < JSONAPI::Serializable::Resource
  #     extra_attribute :net_worth do
  #       @object.assets.sum(&:value)
  #     end
  #   end
  #
  # When the user requests the extra field 'net_worth':
  #
  #   GET /people?extra_fields[people]=net_worth
  #
  # The +assets+ will be eager loaded and the 'net_worth' attribute
  # will be present in the response. If this field is not explicitly
  # requested, none of this logic fires.
  #
  # @see Resource.extra_field
  # @see Extensions::ExtraAttribute
  class Scoping::ExtraFields < Scoping::Base
    # Loop through all requested extra fields. If custom scoping
    # logic is define for that field, run it. Otherwise, do nothing.
    #
    # @return the scope object we are chaining/modofying
    def apply
      each_extra_field do |callable|
        @scope = callable.call(@scope, resource.context)
      end

      @scope
    end

    private

    def each_extra_field
      resource.extra_fields.each_pair do |name, callable|
        if extra_fields.include?(name)
          yield callable
        end
      end
    end

    def extra_fields
      query_hash[:extra_fields][resource.type] || []
    end
  end
end

Version data entries

32 entries across 32 versions & 1 rubygems

Version Path
jsonapi_compliable-0.11.34 lib/jsonapi_compliable/scoping/extra_fields.rb
jsonapi_compliable-0.11.33 lib/jsonapi_compliable/scoping/extra_fields.rb
jsonapi_compliable-0.11.32 lib/jsonapi_compliable/scoping/extra_fields.rb
jsonapi_compliable-0.11.31 lib/jsonapi_compliable/scoping/extra_fields.rb
jsonapi_compliable-0.11.30 lib/jsonapi_compliable/scoping/extra_fields.rb
jsonapi_compliable-0.11.29 lib/jsonapi_compliable/scoping/extra_fields.rb
jsonapi_compliable-0.11.28 lib/jsonapi_compliable/scoping/extra_fields.rb
jsonapi_compliable-0.11.27 lib/jsonapi_compliable/scoping/extra_fields.rb
jsonapi_compliable-0.11.26 lib/jsonapi_compliable/scoping/extra_fields.rb
jsonapi_compliable-0.11.25 lib/jsonapi_compliable/scoping/extra_fields.rb
jsonapi_compliable-0.11.24 lib/jsonapi_compliable/scoping/extra_fields.rb
jsonapi_compliable-0.11.23 lib/jsonapi_compliable/scoping/extra_fields.rb
jsonapi_compliable-0.11.22 lib/jsonapi_compliable/scoping/extra_fields.rb
jsonapi_compliable-0.11.21 lib/jsonapi_compliable/scoping/extra_fields.rb
jsonapi_compliable-0.11.20 lib/jsonapi_compliable/scoping/extra_fields.rb
jsonapi_compliable-0.11.19 lib/jsonapi_compliable/scoping/extra_fields.rb
jsonapi_compliable-0.11.18 lib/jsonapi_compliable/scoping/extra_fields.rb
jsonapi_compliable-0.11.17 lib/jsonapi_compliable/scoping/extra_fields.rb
jsonapi_compliable-0.11.16 lib/jsonapi_compliable/scoping/extra_fields.rb
jsonapi_compliable-0.11.15 lib/jsonapi_compliable/scoping/extra_fields.rb