Sha256: 219209aaccad5a6ffa7c9d8fb9dcaeac79fef975ba8414f0fef751b694063386

Contents?: true

Size: 1.85 KB

Versions: 38

Compression:

Stored size: 1.85 KB

Contents

require "jsonapi/serializable/resource/conditional_fields"

module Graphiti
  module Extensions
    # Only render a given attribute when the user specifically requests it.
    # Useful for computationally-expensive attributes that are not required
    # on every request.
    #
    # This class handles the serialization, but you may also want to run
    # code during scoping (for instance, to eager load associations referenced
    # by this extra attribute. See (Resource.extra_field).
    #
    # @example Basic Usage
    #   # Will only be rendered on user request, ie
    #   # /people?extra_fields[people]=net_worth
    #   extra_attribute :net_worth
    #
    # @example Eager Loading
    #   class PersonResource < ApplicationResource
    #     # If the user requests the 'net_worth' attribute, make sure
    #     # 'assets' are eager loaded
    #     extra_field :net_worth do |scope|
    #       scope.includes(:assets)
    #     end
    #   end
    #
    #   class SerializablePerson < Graphiti::Serializer
    #     # ... code ...
    #     extra_attribute :net_worth do
    #       @object.assets.sum(&:value)
    #     end
    #   end
    #
    # @see Resource.extra_field
    module ExtraAttribute
      def self.included(klass)
        klass.extend ClassMethods
      end

      module ClassMethods
        # @param [Symbol] name the name of the attribute
        # @param [Hash] options the options passed on to vanilla to .attribute
        def extra_attribute(name, options = {}, &blk)
          allow_field = proc {
            if options[:if]
              next false unless instance_exec(&options[:if])
            end

            next false unless @extra_fields

            @extra_fields[@_type]&.include?(name) || @extra_fields[@resource&.type]&.include?(name)
          }

          attribute name, if: allow_field, &blk
        end
      end
    end
  end
end

Version data entries

38 entries across 38 versions & 1 rubygems

Version Path
graphiti-1.7.6 lib/graphiti/extensions/extra_attribute.rb
graphiti-1.7.5 lib/graphiti/extensions/extra_attribute.rb
graphiti-1.7.4 lib/graphiti/extensions/extra_attribute.rb
graphiti-1.7.3 lib/graphiti/extensions/extra_attribute.rb
graphiti-1.7.2 lib/graphiti/extensions/extra_attribute.rb
graphiti-1.7.1 lib/graphiti/extensions/extra_attribute.rb
graphiti-1.7.0 lib/graphiti/extensions/extra_attribute.rb
graphiti-1.6.4 lib/graphiti/extensions/extra_attribute.rb
graphiti-1.6.3 lib/graphiti/extensions/extra_attribute.rb
graphiti-1.6.2 lib/graphiti/extensions/extra_attribute.rb
graphiti-1.6.1 lib/graphiti/extensions/extra_attribute.rb
graphiti-1.6.0 lib/graphiti/extensions/extra_attribute.rb
graphiti-1.5.3 lib/graphiti/extensions/extra_attribute.rb
graphiti-1.5.2 lib/graphiti/extensions/extra_attribute.rb
graphiti-1.5.1 lib/graphiti/extensions/extra_attribute.rb
graphiti-1.5.0 lib/graphiti/extensions/extra_attribute.rb
graphiti-1.4.0 lib/graphiti/extensions/extra_attribute.rb
graphiti-1.3.9 lib/graphiti/extensions/extra_attribute.rb
graphiti-1.3.8 lib/graphiti/extensions/extra_attribute.rb
graphiti-1.3.7 lib/graphiti/extensions/extra_attribute.rb