让我们在GraphQL-Ruby中充分运用枚举类型

首先

在graphql-ruby中,可以定义EnumType(枚举类型)。
本文将解释EnumType的用法和优势。

“EnumType” 是什么- EnumType refers to what

在Rails中的枚举类型

在Rails中,可以通过ActiveRecord定义枚举。
它定义了一个与数据库中整数类型列对应的字符串。
例如,如果一个用户表中有一个用整数类型指定权限的列,可以这样写。

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

按照上述定义,可以轻松描述出每个数字对应的权限,而无需意识到具体的对应关系。

GraphQL的枚举类型

如果不经过思考,直接定义graphql-ruby的objectType,结果如下。

module ObjectTypes
  class UserType < ObjectTypes::BaseObject
    field :name, String, null: false
    field :auth, String, null: false # 文字列として定義される
  end
end

由于GraphQL端不知道ActiveRecord中是否定义了枚举,所以即使字符串未定义在Rails的枚举中,它也会被接受。因此,在GraphQL端也需要定义与Rails的枚举对应的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,所以我们也可以将Enum应用到ObjectType中。

module ObjectTypes
  class UserType < ObjectTypes::BaseObject
    field :name, String, null: false
    field :auth, Types::AuthType, null: false # Enumを指定
  end
end

我們成功地在GraphQL端定義了enum,不僅可以在ObjectType中定義,還可以在InputType中定義。

为什么要定义枚举类型?

其实,不用专门定义EnumType作为实现也没有问题。如果从前端传入的枚举值没有定义,ActiveRecord会抛出异常,因此不必担心数据库会出现非法值。

定义EnumType的目的是提前通知前端会有什么样的值。特别是最近很多前端都使用Typescript,可以提前用enum的值来创建类型,应该更易于处理。特别是在从graphql模式自动生成类型的情况下,非常方便。

请定义一个enum,我相信前端开发人员会非常高兴,所以请务必定义好。

广告
将在 10 秒后关闭
bannerAds