Class: GraphQL::UnionType

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

Overview

A Union is is a collection of object types which may appear in the same place.

The members of a union are declared with possible_types.

A union itself has no fields; only its members have fields. So, when you query, you must use fragment spreads to access fields.

Examples:

A union of object types

MediaUnion = GraphQL::UnionType.define do
  name "Media"
  description "Media objects which you can enjoy"
  possible_types [AudioType, ImageType, VideoType]
end

Querying for fields on union members

{
  searchMedia(name: "Jens Lekman") {
    ... on Audio { name, duration }
    ... on Image { name, height, width }
    ... on Video { name, length, quality }
  }
}

Instance Attribute Summary collapse

Attributes inherited from BaseType

#ast_node, #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, #default_relay?, #default_scalar?, #get_field, #introspection?, #list?, #non_null?, resolve_related_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 Relay::TypeExtensions

#connection_type, #define_connection, #define_edge, #edge_type

Methods included from Define::InstanceDefinable

#define, #metadata, #redefine

Methods included from Define::NonNullWithBang

#!

Constructor Details

#initializeUnionType

Returns a new instance of UnionType



32
33
34
35
36
37
# File 'lib/graphql/union_type.rb', line 32

def initialize
  super
  @dirty_possible_types = []
  @clean_possible_types = nil
  @resolve_type_proc = nil
end

Instance Attribute Details

#resolve_type_procObject

Returns the value of attribute resolve_type_proc



30
31
32
# File 'lib/graphql/union_type.rb', line 30

def resolve_type_proc
  @resolve_type_proc
end

Instance Method Details

#get_possible_type(type_name, ctx) ⇒ GraphQL::ObjectType?

Get a possible type of this GraphQL::UnionType by type name

Parameters:

Returns:



74
75
76
77
# File 'lib/graphql/union_type.rb', line 74

def get_possible_type(type_name, ctx)
  type = ctx.query.get_type(type_name)
  type if type && ctx.query.schema.possible_types(self).include?(type)
end

#include?(child_type_defn) ⇒ Boolean

Returns True if child_type_defn is a member of this GraphQL::UnionType

Returns:



50
51
52
# File 'lib/graphql/union_type.rb', line 50

def include?(child_type_defn)
  possible_types.include?(child_type_defn)
end

#initialize_copy(other) ⇒ Object



39
40
41
42
43
# File 'lib/graphql/union_type.rb', line 39

def initialize_copy(other)
  super
  @clean_possible_types = nil
  @dirty_possible_types = other.dirty_possible_types.dup
end

#kindObject



45
46
47
# File 'lib/graphql/union_type.rb', line 45

def kind
  GraphQL::TypeKinds::UNION
end

#possible_type?(type, ctx) ⇒ Boolean

Check if a type is a possible type of this GraphQL::UnionType

Parameters:

Returns:

  • (Boolean)

    True if the type exists and is a member of this GraphQL::UnionType, (else nil)



83
84
85
86
# File 'lib/graphql/union_type.rb', line 83

def possible_type?(type, ctx)
  type_name = type.is_a?(String) ? type : type.graphql_name
  !get_possible_type(type_name, ctx).nil?
end

#possible_typesArray<GraphQL::ObjectType>

Returns Types which may be found in this union

Returns:



60
61
62
63
64
65
66
67
68
# File 'lib/graphql/union_type.rb', line 60

def possible_types
  @clean_possible_types ||= begin
    if @dirty_possible_types.respond_to?(:map)
      @dirty_possible_types.map { |type| GraphQL::BaseType.resolve_related_type(type) }
    else
      @dirty_possible_types
    end
  end
end

#possible_types=(new_possible_types) ⇒ Object



54
55
56
57
# File 'lib/graphql/union_type.rb', line 54

def possible_types=(new_possible_types)
  @clean_possible_types = nil
  @dirty_possible_types = new_possible_types
end

#resolve_type(value, ctx) ⇒ Object



88
89
90
# File 'lib/graphql/union_type.rb', line 88

def resolve_type(value, ctx)
  ctx.query.resolve_type(self, value)
end

#resolve_type=(new_resolve_type_proc) ⇒ Object



92
93
94
# File 'lib/graphql/union_type.rb', line 92

def resolve_type=(new_resolve_type_proc)
  @resolve_type_proc = new_resolve_type_proc
end