#はじめに
graphql-rubyでは、EnumType(列挙型)を定義することができます。
本記事では、EnumTypeの利用方法やメリットについて説明します。
#EnumTypeとは
Railsのenum
Railsでは、ActiveRecordでenumを定義できます。
dbに整数型のカラムに対応した文字列を定義したものです。
例えば、あるUserテーブルに権限を整数型で指定したカラムがあるとすると以下のように書くことができます。
enum auth: { read: 0, write: 10, admin: 20 }
上記のように定義すると、どの数字がどの権限に対応しているかを意識することなく、記述することができます。
GraphQLのEnumType
graphql-rubyのobjectTypeを何も考えずに定義すると以下のようになります。
module ObjectTypes
class UserType < ObjectTypes::BaseObject
field :name, String, null: false
field :auth, String, null: false # 文字列として定義される
end
end
graphql側はAcitiveRecrdでenumが定義されていることは知る由もないので、railsのenumに定義していない文字列でも受け入れてしまいます。そこで、graphql側にもrailsのenumに相当するEnumTypeを定義する必要があります。
まず、graphq/types以下にbase_enum.rbがあることを確認しましょう。デフォルトで入っているかと思います。
そしてbase_enum.rbを継承するauth_enum.rbを作成します。
module Types
class AuthEnum < Types::BaseEnum
value "read"
value "write"
value "admin"
end
end
これでEnumTypeが定義できます。
EnumTypeが定義できたので、ObjectTypeにもEnumを適用します。
module ObjectTypes
class UserType < ObjectTypes::BaseObject
field :name, String, null: false
field :auth, Types::AuthType, null: false # Enumを指定
end
end
無事にgraphql側にもenumを定義することができました。もちろん、ObjectTypeだけでなくInputTypeにも定義できます。
#なぜenumを定義するか
実は、わざわざEnumTypeを定義しなくても実装としては問題ありません。定義されていないenumがフロントエンドから代入された場合には、ActiveRecordが例外を吐いてくれるので、DBに不正な値が入る心配はありません。
EnumTypeを定義するのは、フロントエンドにどのような値が入るのかを前もって知らせるためです。
特に最近のフロントエンドの多くはTypescriptを使用していると思いますので、事前にenumの値で型を作ることができ、より扱いやすいはずです。特にgraphqlのスキーマから自動で型を生成している場合にはとても便利です。
enumを定義するとフロントエンドの人が喜ぶと思うのでぜひ定義してあげて下さい。