4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

GraphQL-RubyでEnumを活用しよう

Posted at

#はじめに
graphql-rubyでは、EnumType(列挙型)を定義することができます。
本記事では、EnumTypeの利用方法やメリットについて説明します。
#EnumTypeとは

Railsのenum

Railsでは、ActiveRecordでenumを定義できます。
dbに整数型のカラムに対応した文字列を定義したものです。
例えば、あるUserテーブルに権限を整数型で指定したカラムがあるとすると以下のように書くことができます。

usr.rb
enum auth: { read: 0, write: 10, admin: 20 }

上記のように定義すると、どの数字がどの権限に対応しているかを意識することなく、記述することができます。

GraphQLのEnumType

graphql-rubyのobjectTypeを何も考えずに定義すると以下のようになります。

user_object.rb
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を作成します。

types/auth_enum.rb
module Types
  class AuthEnum < Types::BaseEnum
    value "read"
    value "write"
    value "admin"
  end
end

これでEnumTypeが定義できます。
EnumTypeが定義できたので、ObjectTypeにもEnumを適用します。

user_object.rb
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を定義するとフロントエンドの人が喜ぶと思うのでぜひ定義してあげて下さい。

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?