💘

GraphQL ruby でEnumの命名を〇〇_Typeにする

2022/10/23に公開

この記事は以下のページに移動しました。

https://noh.ink/articles/ybo9tz1IK8k1nWIuHe6R




GraphQLではEnumを定義できて、以下のように書きます。
(ファイルの置き場所を変えてるのでファイルパスとモジュール名は読み替えてください)

app/graphql/types/enums/sort_type.rb
class Types::Enums::SortType < Types::BaseEnum
  value 'ASC', value: :asc
  value 'DESC', value: :desc
end

このEnumは以下のように使えます。

app/graphql/types/query_type.rb
module Types
  class QueryType < Types::BaseObject
    # 省略

    field :posts, Types::Objects::PostType.connection_type, null: false do
      argument :sort, Types::Enums::SortType, required: false, default_value: :desc
    end

    def posts(sort:)
      Post.order(id: sort)
    end
  end
end

一見これで完了したように思えますが、意図した挙動はしません。

schema.json
{
  "kind": "ENUM",
  "name": "Sort",
  ...
},

nameがSortになってしまっていて、クラス名につけた_Typeが削除されてます。

Enumの名前をクラス名とは別に設定する

graphql_nameを指定することで実現できます。

app/graphql/types/enums/sort_type.rb
class Types::Enums::SortType < Types::BaseEnum
+   graphql_name 'SortType'
+ 
  value 'ASC', value: :asc
  value 'DESC', value: :desc
end

bundle exec rails graphql:schema:jsonでGraphQLスキーマファイルを再度確認してみると、nameがちゃんとSortTypeになってるのが確認できます。

schema.json
{
  "kind": "ENUM",
  "name": "SortType",
  ...
},

Discussion