🦍

GraphQL-Rubyでenum(列挙型)を使う方法

2021/09/27に公開

はじめに

GraphQL-Rubyでenumを使う方法についての解説です。
間違っている箇所等ございましたらコメントで指摘いただけると助かります。

Enum(列挙型とは??)

詳しくはこちらの記事(自分が書いたもの)に書いてあります。
https://qiita.com/nisitin/items/94720f8dae3be39ae5d2

一部抜粋して説明するとenumは[列挙型]と言われるもので[列挙型]とは何かというと、プログラミング言語やデータベース管理システムなどにおけるデータ型の一つとされています。また複数の異なる定数を一つの集合として定義するものでもあります。

Railsのenum使うよね??

僕は少し前にRailsのenumの使い方について学んで、そこから馬鹿の一つ覚えのようにenum使えそうじゃない??と思うようになりました。そこでGrapqQL-Rubyを使ってapi開発をしてたときにここでも使いたい!!と思い馬鹿の一つ覚えのように使おうとしました。

そして調べてみるとenumで定義している文字列はGraphQLでは識別子として書き込まれて返ってくる値としては

enum pc: { mac: 0, windows: 1 }

このような定義をするとgraphiqlでは0か1の値しか返ってきません。
作成者はわかるかもしれませんが、他の作業する方がいた時に毎回調べて作業するのは骨の折れる作業だと思います。

そこでこれらを解決する方法があり、それは何かというとGraphQL側にも同様にenumを定義してあげるということです。
具体的な方法はgraphql/typesの中のbase_enum.rbを継承するenumファイルを作成してあげるてそこで定義するということです。

上記の例で言うと

module Types
  class PcEnum < Types::BaseEnum
  #二つ目のvalueにenumで既に設定されている文字列を定義する
  #ここではわかりやすく一つ目のvalueを大文字で返すようにしています  
    value "MAC", value: "mac" 
    value "WINDOWS", value: "windows"
  end
end

このように定義してあげて

module Types
  class ProfileType < Types::BaseObject
    field :age, Int, null false
    filed :pc, Types::PcEnum, null true
  end
end

と定義してあげることでGraphQLでもenumを使って開発をすることができます!!

参考文献

https://graphql-ruby.org/type_definitions/enums

Discussion