使用Rails+graphql-ruby来定义日期和时间类型

首先

由于在工作中试用了GraphQL,我决定提取一些看起来可用的内容来写。这次我将定义日期时间类型。

环境

红宝石2.4.2
轨道5.1.4
GraphQL-Ruby 1.7.4

使用情境

当需要将MySQL等数据库连接并处理数据库中的“datetime型”时,希望在应用程序的GraphQL中实现共通化处理时。

你要怎么做?

使用GraphQL的ScalarType。
GraphQL原本已定义以下标量类型:

Int
Float
String
Boolean
ID

当将DB连接在一起时,缺乏日期时间类型会带来困难。
因此,为了统一处理类型,我们将添加日期时间类型。

目录结构

├── app
│   ├── graphql
│   │   ├── functions
│   │   ├── loaders
│   │   ├── mutations
│   │   ├── schema.rb
│   │   └── types
│   │       ├── date_time_type.rb
│   │       ├── user_type.rb
│   │       ├── query_type.rb

进行解释或规定。

Types::DateTimeType = GraphQL::ScalarType.define do
  name 'DateTimeType'

  coerce_input ->(value, _context) { Time.zone.parse value }
  coerce_result ->(value, _context) { I18n.l(value, format: :default) }
end

本例中使用了locales来定义格式,并对其进行整理。
这只是一个例子,请根据您使用的应用程序选择使用locales并进行设置。

ja:
  time:
    formats:
      default: "%Y/%m/%d %H:%M:%S"

请使用。

Types::UserType = GraphQL::ObjectType.define do
  name "User"

  field :id, !types.ID
  field :name, !types.String
  field :created_at, Types::DateTimeType # ここ
  field :updated_at, Types::DateTimeType
  field :deleted_at, Types::DateTimeType
end

请在Graphiql等工具中执行查询并确认。

广告
将在 10 秒后关闭
bannerAds