Class: GraphQL::Field
- Inherits:
-
Object
- Object
- GraphQL::Field
- Includes:
- Define::InstanceDefinable
- Defined in:
- lib/graphql/field.rb,
lib/graphql/field/resolve.rb
Overview
Fields belong to ObjectTypes and InterfaceTypes.
They're usually created with the field
helper. If you create it by hand, make sure #name is a String.
A field must have a return type, but if you want to defer the return type calculation until later, you can pass a proc for the return type. That proc will be called when the schema is defined.
For complex field definition, you can pass a block to the field
helper, eg field :name do ... end
.
This block is equivalent to calling GraphQL::Field.define { ... }
.
Resolve
Fields have resolve
functions to determine their values at query-time.
The default implementation is to call a method on the object based on the field name.
You can specify a custom proc with the resolve
helper.
There are some shortcuts for common resolve
implementations:
- Provide
property:
to call a method with a different name than the field name - Provide
hash_key:
to resolve the field by doing a key lookup, egobj[:my_hash_key]
Arguments
Fields can take inputs; they're called arguments. You can define them with the argument
helper.
They can have default values which will be provided to resolve
if the query doesn't include a value.
Only certain types maybe used for inputs:
- Scalars
- Enums
- Input Objects
- Lists of those types
Input types may also be non-null -- in that case, the query will fail if the input is not present.
Complexity
Fields can have complexity values which describe the computation cost of resolving the field.
You can provide the complexity as a constant with complexity:
or as a proc, with the complexity
helper.
Defined Under Namespace
Modules: DefaultLazyResolve, Resolve
Instance Attribute Summary collapse
-
#arguments ⇒ Hash<String => GraphQL::Argument>
Map String argument names to their Argument implementations.
-
#complexity ⇒ Numeric, Proc
The complexity for this field (default: 1), as a constant or a proc like
->(query_ctx, args, child_complexity) { } # Numeric
. -
#deprecation_reason ⇒ String?
The client-facing reason why this field is deprecated (if present, the field is deprecated).
-
#description ⇒ String?
The client-facing description of this field.
-
#hash_key ⇒ Object?
The key to access with
obj.[]
to resolve this field (overrides #name if present). -
#lazy_resolve_proc ⇒ <#call(obj, args, ctx)>
readonly
A proc-like object which can be called trigger a lazy resolution.
-
#mutation ⇒ GraphQL::Relay::Mutation?
The mutation this field was derived from, if it was derived from a mutation.
-
#name ⇒ String
The name of this field on its ObjectType (or InterfaceType).
-
#property ⇒ Symbol?
The method to call on
obj
to return this field (overrides #name if present). -
#relay_node_field ⇒ Boolean
True if this is the Relay find-by-id field.
-
#resolve_proc ⇒ <#call(obj, args, ctx)>
readonly
A proc-like object which can be called to return the field's value.
Instance Method Summary collapse
-
#initialize ⇒ Field
constructor
A new instance of Field.
- #initialize_copy(other) ⇒ Object
-
#lazy_resolve(obj, args, ctx) ⇒ Object
If #resolve returned and object which should be handled lazily, this method will be called later force the object to return its value.
-
#lazy_resolve=(new_lazy_resolve_proc) ⇒ Object
Assign a new resolve proc to this field.
-
#prepare_lazy(obj, args, ctx) ⇒ GraphQL::Execution::Lazy
Prepare a lazy value for this field.
-
#resolve(object, arguments, context) ⇒ Object
Get a value for this field.
-
#resolve=(new_resolve_proc) ⇒ Object
Provide a new callable for this field's resolve function.
- #to_s ⇒ Object
-
#type ⇒ Object
Get the return type for this field.
- #type=(new_return_type) ⇒ Object
Methods included from Define::InstanceDefinable
Constructor Details
#initialize ⇒ Field
Returns a new instance of Field.
171 172 173 174 175 176 177 |
# File 'lib/graphql/field.rb', line 171 def initialize @complexity = 1 @arguments = {} @resolve_proc = build_default_resolver @lazy_resolve_proc = DefaultLazyResolve @relay_node_field = false end |
Instance Attribute Details
#arguments ⇒ Hash<String => GraphQL::Argument>
Returns Map String argument names to their Argument implementations.
157 158 159 |
# File 'lib/graphql/field.rb', line 157 def arguments @arguments end |
#complexity ⇒ Numeric, Proc
Returns The complexity for this field (default: 1), as a constant or a proc like ->(query_ctx, args, child_complexity) { } # Numeric
.
163 164 165 |
# File 'lib/graphql/field.rb', line 163 def complexity @complexity end |
#deprecation_reason ⇒ String?
Returns The client-facing reason why this field is deprecated (if present, the field is deprecated).
154 155 156 |
# File 'lib/graphql/field.rb', line 154 def deprecation_reason @deprecation_reason end |
#description ⇒ String?
Returns The client-facing description of this field.
151 152 153 |
# File 'lib/graphql/field.rb', line 151 def description @description end |
#hash_key ⇒ Object?
Returns The key to access with obj.[]
to resolve this field (overrides #name if present).
169 170 171 |
# File 'lib/graphql/field.rb', line 169 def hash_key @hash_key end |
#lazy_resolve_proc ⇒ <#call(obj, args, ctx)> (readonly)
Returns A proc-like object which can be called trigger a lazy resolution.
145 146 147 |
# File 'lib/graphql/field.rb', line 145 def lazy_resolve_proc @lazy_resolve_proc end |
#mutation ⇒ GraphQL::Relay::Mutation?
Returns The mutation this field was derived from, if it was derived from a mutation.
160 161 162 |
# File 'lib/graphql/field.rb', line 160 def mutation @mutation end |
#name ⇒ String
Returns The name of this field on its ObjectType (or InterfaceType).
148 149 150 |
# File 'lib/graphql/field.rb', line 148 def name @name end |
#property ⇒ Symbol?
Returns The method to call on obj
to return this field (overrides #name if present).
166 167 168 |
# File 'lib/graphql/field.rb', line 166 def property @property end |
#relay_node_field ⇒ Boolean
Returns True if this is the Relay find-by-id field.
139 140 141 |
# File 'lib/graphql/field.rb', line 139 def relay_node_field @relay_node_field end |
#resolve_proc ⇒ <#call(obj, args, ctx)> (readonly)
Returns A proc-like object which can be called to return the field's value.
142 143 144 |
# File 'lib/graphql/field.rb', line 142 def resolve_proc @resolve_proc end |
Instance Method Details
#initialize_copy(other) ⇒ Object
179 180 181 182 |
# File 'lib/graphql/field.rb', line 179 def initialize_copy(other) super @arguments = other.arguments.dup end |
#lazy_resolve(obj, args, ctx) ⇒ Object
If #resolve returned and object which should be handled lazily, this method will be called later force the object to return its value.
246 247 248 |
# File 'lib/graphql/field.rb', line 246 def lazy_resolve(obj, args, ctx) @lazy_resolve_proc.call(obj, args, ctx) end |
#lazy_resolve=(new_lazy_resolve_proc) ⇒ Object
Assign a new resolve proc to this field. Used for #lazy_resolve
251 252 253 |
# File 'lib/graphql/field.rb', line 251 def lazy_resolve=(new_lazy_resolve_proc) @lazy_resolve_proc = new_lazy_resolve_proc end |
#prepare_lazy(obj, args, ctx) ⇒ GraphQL::Execution::Lazy
Prepare a lazy value for this field. It may be then
-ed and resolved later.
257 258 259 260 261 |
# File 'lib/graphql/field.rb', line 257 def prepare_lazy(obj, args, ctx) GraphQL::Execution::Lazy.new { lazy_resolve(obj, args, ctx) } end |
#resolve(object, arguments, context) ⇒ Object
Get a value for this field
191 192 193 |
# File 'lib/graphql/field.rb', line 191 def resolve(object, arguments, context) resolve_proc.call(object, arguments, context) end |
#resolve=(new_resolve_proc) ⇒ Object
198 199 200 |
# File 'lib/graphql/field.rb', line 198 def resolve=(new_resolve_proc) @resolve_proc = new_resolve_proc || build_default_resolver end |
#to_s ⇒ Object
236 237 238 |
# File 'lib/graphql/field.rb', line 236 def to_s "<Field name:#{name || "not-named"} desc:#{description} resolve:#{resolve_proc}>" end |
#type ⇒ Object
Get the return type for this field.
208 209 210 |
# File 'lib/graphql/field.rb', line 208 def type @clean_type ||= GraphQL::BaseType.(@dirty_type) end |
#type=(new_return_type) ⇒ Object
202 203 204 205 |
# File 'lib/graphql/field.rb', line 202 def type=(new_return_type) @clean_type = nil @dirty_type = new_return_type end |