GraphQL Rubyのglobal_id_fieldを使ってみる (Rails)

December 18, 2022

確認環境

$ bundle exec ruby --version
ruby 2.7.5p203 (2021-11-24 revision f69aeb8314) [x86_64-darwin19]
$ bundle exec rails --version
Rails 6.0.4.6
$ bundle info graphql
  * graphql (2.0.13)
	Summary: A GraphQL language and runtime for Ruby
	Homepage: https://github.com/rmosolgo/graphql-ruby
	Path: /Users/xxxxx/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/graphql-2.0.13

データ準備

テーブル定義確認

$ rails db
sqlite> .schema posts
CREATE TABLE IF NOT EXISTS "posts" ("id" integer PRIMARY KEY AUTOINCREMENT NOT NULL, "title" varchar, "description" text, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL);

検証コードを実装

app/graphql/types/post_type.rb

# frozen_string_literal: true

module Types
  class PostType < Types::BaseObject
    global_id_field :id

    field :title, String
    field :created_at, GraphQL::Types::ISO8601DateTime, null: false
    field :updated_at, GraphQL::Types::ISO8601DateTime, null: false
  end
end

app/graphql/sample6_schema.rb

class Sample6Schema < GraphQL::Schema
  mutation(Types::MutationType)
  query(Types::QueryType)

  # Relay-style Object Identification:
  def self.id_from_object(object, _type, _context)
    "#{_type}_#{object.id}"
  end
end

app/graphql/types/query_type.rb

module Types
  class QueryType < Types::BaseObject
    field :posts, [Types::PostType], null: false
    def posts
      Post.all.limit(3)
    end
  end
end

graphiql でクエリを発行する

query {
	posts {
    id
    title
  }
}

取得結果

{
  "data": {
    "posts": [
      {
        "id": "Types::PostType_2",
        "title": "title_0"
      },
      {
        "id": "Types::PostType_3",
        "title": "title_1"
      },
      {
        "id": "Types::PostType_4",
        "title": "title_2"
      }
    ]
  }
}

参考


SHARE

Profile picture

Written by tamesuu