让我们在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,我相信前端开发人员会非常高兴,所以请务必定义好。