Graphql-ruby objects: Difference between revisions

From wikinotes
 
(7 intermediate revisions by the same user not shown)
Line 20: Line 20:
<syntaxhighlight lang="ruby">
<syntaxhighlight lang="ruby">
class User < GraphQL::Schema::Object
class User < GraphQL::Schema::Object
   field :id, Integer    # name, returntype
   field :id, Integer, null: false   # name, returntype, nilable?
   field :age, Integer  # name, returntype
   field :age, Integer, null: false   # name, returntype, nilable?


   def id
   def id
Line 43: Line 43:


class QueryRoot < GraphQL::Schema::Object
class QueryRoot < GraphQL::Schema::Object
   field :user, User, do |field|
   field :user, User, null: false do |field|
     field.argument(:id, Integer, required: true)
     field.argument(:id, Integer, required: true)
   end
   end
Line 53: Line 53:
</syntaxhighlight>
</syntaxhighlight>
</blockquote><!-- Parametrized Fields -->
</blockquote><!-- Parametrized Fields -->
= Resolvers =
<blockquote>
Field resolvers are used to return results for a query.<br>
Resolvers can be expressed as objects, or as methods matching the name of the field.
Method resolver
<syntaxhighlight lang="ruby">
class QueryRoot < GraphQL::Schema::Object
  field :name, String, null: false
  def name
    "Alex"
  end
end
</syntaxhighlight>
Object resolver
<syntaxhighlight lang="ruby">
class QueryRoot < GraphQL::Schema::Object
  field :name, resolver: Resolvers::Name
end
module Resolvers
  class Name < GraphQL::Schema::Resolver
    type String, null: false
    def resolve
      "Alex"
    end
  end
end
</syntaxhighlight>
Object resolvers can have arguments, just like method resolvers
<syntaxhighlight lang="ruby">
USERS = [
  {id: 100, name: "vaderd"},
  {id: 101, name: "skywalkerl"},
]
module Resolvers
  class Name < GraphQL::Schema::Resolver
    type String, null: false
    argument :id, Integer, required: true
    def resolve(id:)
      user = USERS.find { |user| user[:id] == id }
      user[:name]
    end
  end
end
</syntaxhighlight>
</blockquote><!-- Resolvers -->
</blockquote><!-- Fields -->
</blockquote><!-- Fields -->

Latest revision as of 18:45, 6 September 2021

Documentation

type docs https://graphql-ruby.org/guides#type-definitions-guides
field docs https://graphql-ruby.org/guides#fields-guides

Fields

All objects in graphql are exposed using fields.
Mutations are added as fields to the root Mutation object,
and Queries are added to the root Query object.

Fields

class User < GraphQL::Schema::Object
  field :id, Integer, null: false    # name, returntype, nilable?
  field :age, Integer, null: false   # name, returntype, nilable?

  def id
    return 100
  end

  def age
    return 30
  end
end

Parametrized Fields

USERS = [
  {id: 100, name: "vaderd"},
  {id: 101, name: "skywalkerl"},
]

class QueryRoot < GraphQL::Schema::Object
  field :user, User, null: false do |field|
    field.argument(:id, Integer, required: true)
  end

  def user(id:)
    USERS.find { |user| user[:id] == id }
  end
end

Resolvers

Field resolvers are used to return results for a query.
Resolvers can be expressed as objects, or as methods matching the name of the field.

Method resolver

class QueryRoot < GraphQL::Schema::Object
  field :name, String, null: false

  def name
    "Alex"
  end
end

Object resolver

class QueryRoot < GraphQL::Schema::Object
  field :name, resolver: Resolvers::Name
end

module Resolvers
  class Name < GraphQL::Schema::Resolver
    type String, null: false

    def resolve
      "Alex"
    end
  end
end

Object resolvers can have arguments, just like method resolvers

USERS = [
  {id: 100, name: "vaderd"},
  {id: 101, name: "skywalkerl"},
]

module Resolvers
  class Name < GraphQL::Schema::Resolver
    type String, null: false

    argument :id, Integer, required: true

    def resolve(id:)
      user = USERS.find { |user| user[:id] == id }
      user[:name]
    end
  end
end