Class: GraphQL::ObjectType

Inherits:
BaseType show all
Defined in:
lib/graphql/object_type.rb

Overview

This type exposes fields on an object.

Examples:

defining a type for your IMDB clone

MovieType = GraphQL::ObjectType.define do
  name "Movie"
  description "A full-length film or a short film"
  interfaces [ProductionInterface, DurationInterface]

  field :runtimeMinutes, !types.Int, property: :runtime_minutes
  field :director, PersonType
  field :cast, CastType
  field :starring, types[PersonType] do
    argument :limit, types.Int
    resolve ->(object, args, ctx) {
      stars = object.cast.stars
      args[:limit] && stars = stars.limit(args[:limit])
      stars
    }
   end
end

Direct Known Subclasses

Relay::Edge

Instance Attribute Summary collapse

Attributes inherited from BaseType

#default_relay, #default_scalar, #description, #introspection, #name

Instance Method Summary collapse

Methods inherited from BaseType

#==, #coerce_input, #coerce_isolated_input, #coerce_isolated_result, #coerce_result, #connection_type, #default_relay?, #default_scalar?, #define_connection, #define_edge, #edge_type, #introspection?, resolve_related_type, #resolve_type, #to_definition, #to_list_type, #to_non_null_type, #to_s, #unwrap, #valid_input?, #valid_isolated_input?, #validate_input, #validate_isolated_input

Methods included from Define::InstanceDefinable

#define, #metadata, #redefine

Methods included from Define::NonNullWithBang

#!

Constructor Details

#initializeObjectType

Returns a new instance of ObjectType



37
38
39
40
41
42
43
# File 'lib/graphql/object_type.rb', line 37

def initialize
  super
  @fields = {}
  @interface_fields = {}
  @dirty_interfaces = []
  @dirty_inherited_interfaces = []
end

Instance Attribute Details

#fieldsHash<String => GraphQL::Field>

Returns Map String fieldnames to their Field implementations

Returns:



31
32
33
# File 'lib/graphql/object_type.rb', line 31

def fields
  @fields
end

#mutationGraphQL::Relay::Mutation?

Returns The mutation this field was derived from, if it was derived from a mutation

Returns:



37
38
39
# File 'lib/graphql/object_type.rb', line 37

def mutation
  @mutation
end

Instance Method Details

#all_fieldsArray<GraphQL::Field>

These fields don't have instrumenation applied

Returns:

  • (Array<GraphQL::Field>)

    All fields, including ones inherited from interfaces

See Also:

  • Get fields with instrumentation


86
87
88
# File 'lib/graphql/object_type.rb', line 86

def all_fields
  interface_fields.merge(self.fields).values
end

#get_field(field_name) ⇒ GraphQL::Field

This fields doesnt have instrumenation applied

Returns:

  • (GraphQL::Field)

    The field definition for field_name (may be inherited from interfaces)

See Also:

  • Get field with instrumentation


79
80
81
# File 'lib/graphql/object_type.rb', line 79

def get_field(field_name)
  fields[field_name] || interface_fields[field_name]
end

#implements(interfaces, inherit: false) ⇒ Object

Declare that this object implements this interface. This declaration will be validated when the schema is defined.

Parameters:

  • interfaces (Array<GraphQL::Interface>)

    add a new interface that this type implements

  • inherits (Boolean)

    If true, copy the interfaces' field definitions to this type



94
95
96
97
98
99
100
101
102
103
# File 'lib/graphql/object_type.rb', line 94

def implements(interfaces, inherit: false)
  if !interfaces.is_a?(Array)
    raise ArgumentError, "`implements(interfaces)` must be an array, not #{interfaces.class} (#{interfaces})"
  end

  @clean_interfaces = nil
  @clean_inherited_fields = nil
  dirty_ifaces = inherit ? @dirty_inherited_interfaces : @dirty_interfaces
  dirty_ifaces.concat(interfaces)
end

#initialize_copy(other) ⇒ Object



45
46
47
48
49
50
51
52
# File 'lib/graphql/object_type.rb', line 45

def initialize_copy(other)
  super
  @clean_interfaces = nil
  @clean_inherited_interfaces = nil
  @dirty_interfaces = other.dirty_interfaces.dup
  @dirty_inherited_interfaces = other.dirty_inherited_interfaces.dup
  @fields = other.fields.dup
end

#interfacesObject



67
68
69
70
# File 'lib/graphql/object_type.rb', line 67

def interfaces
  load_interfaces
  @clean_interfaces
end

#interfaces=(new_interfaces) ⇒ Object

Deprecated.

Use implements instead of interfaces.

This method declares interfaces for this type AND inherits any field definitions

Parameters:

  • new_interfaces (Array<GraphQL::Interface>)

    interfaces that this type implements



57
58
59
60
61
62
63
64
65
# File 'lib/graphql/object_type.rb', line 57

def interfaces=(new_interfaces)
  @clean_interfaces = nil
  @clean_inherited_interfaces = nil
  @clean_inherited_fields = nil

  @dirty_inherited_interfaces = []
  @dirty_inherited_fields = {}
  implements(new_interfaces, inherit: true)
end

#kindObject



72
73
74
# File 'lib/graphql/object_type.rb', line 72

def kind
  GraphQL::TypeKinds::OBJECT
end