Sha256: 748731568a61924a2bda39888dd8a94dbd04e1424ff8bb29cc76204468987fa1

Contents?: true

Size: 1.82 KB

Versions: 58

Compression:

Stored size: 1.82 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_eval(&options[:if])
            end

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

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

Version data entries

58 entries across 58 versions & 1 rubygems

Version Path
graphiti-1.0.rc.21 lib/graphiti/extensions/extra_attribute.rb
graphiti-1.0.rc.19 lib/graphiti/extensions/extra_attribute.rb
graphiti-1.0.rc.18 lib/graphiti/extensions/extra_attribute.rb
graphiti-1.0.rc.17 lib/graphiti/extensions/extra_attribute.rb
graphiti-1.0.rc.16 lib/graphiti/extensions/extra_attribute.rb
graphiti-1.0.rc.15 lib/graphiti/extensions/extra_attribute.rb
graphiti-1.0.rc.14 lib/graphiti/extensions/extra_attribute.rb
graphiti-1.0.rc.12 lib/graphiti/extensions/extra_attribute.rb
graphiti-1.0.rc.11 lib/graphiti/extensions/extra_attribute.rb
graphiti-1.0.rc.10 lib/graphiti/extensions/extra_attribute.rb
graphiti-1.0.rc.9 lib/graphiti/extensions/extra_attribute.rb
graphiti-1.0.rc.8 lib/graphiti/extensions/extra_attribute.rb
graphiti-1.0.rc.7 lib/graphiti/extensions/extra_attribute.rb
graphiti-1.0.rc.6 lib/graphiti/extensions/extra_attribute.rb
graphiti-1.0.rc.5 lib/graphiti/extensions/extra_attribute.rb
graphiti-1.0.rc.4 lib/graphiti/extensions/extra_attribute.rb
graphiti-1.0.rc.3 lib/graphiti/extensions/extra_attribute.rb
graphiti-1.0.rc.2 lib/graphiti/extensions/extra_attribute.rb
graphiti-1.0.rc.1 lib/graphiti/extensions/extra_attribute.rb
graphiti-1.0.beta.23 lib/graphiti/extensions/extra_attribute.rb