web-dev-qa-db-fra.com

graphql-Ruby, type date ou date/heure

Je ne suis pas le seul à ne pas savoir utiliser les types Datetime avec GraphQL-Ruby: https://github.com/rmosolgo/graphql-Ruby-demo/issues/27 , comme vous pouvez le voir il y a 18 personnes comme moi.

Comment puis-je utiliser Date/heure pour certains champs comme celui-ci?

Types::PlayerType = GraphQL::ObjectType.define do
  name 'Player'

  field :id, !types.ID
  field :birth_date, types.Datetime #or what?
  field :death_date, !types.Datetime #or what?
  field :note, types.String
end

Peut-être que je dois utiliser ceci ( https://github.com/howtographql/graphql-Ruby/blob/master/app/graphql/types/date_time_type.rb ):

date_time_type.rb :

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

  coerce_input ->(value, _ctx) { Time.zone.parse(value) }
  coerce_result ->(value, _ctx) { value.utc.iso8601 }
end

Quelqu'un peut-il mieux l'expliquer?

9
user4412054

GraphQL::Types::ISO8601DateTime a récemment été ajouté à graphql-Ruby.

Exemple d'utilisation: field :created_at, GraphQL::Types::ISO8601DateTime, null: false

8
dostu

La déclaration de type devrait fonctionner correctement. Gardez à l'esprit que le type DateTime que vous avez collé se trouve dans le module "Types". Utilisez-le comme ceci:

Types::PlayerType = GraphQL::ObjectType.define do
  name 'Player'

  field :id, !types.ID
  field :birth_date, Types::DateTimeType
  field :death_date, Types::DateTimeType
  field :note, types.String
end
2
ChrisK

Selon code source , il n'y a que 5 types (Int, String, Float, Boolean, ID) définis en tant que méthode, ce qui signifie que vous ne pouvez pas utiliser types.DateTime.

Pour personnaliser DateTimeType, vous pouvez référencer son document de la pierre précieuse et l'implémenter comme ci-dessus ( date_time_type.rb ), puis l'utiliser comme suit:

field :birth_date, Types::DateTimeType

1
Andy Wang

Pas sûr d'avoir une meilleure explication, mais j'ai réussi à le faire en collant le code ci-dessus pour définir ma propre variable scalaire DateTimeType:

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

  coerce_input ->(value, _ctx) { Time.zone.parse(value) }
  coerce_result ->(value, _ctx) { value.utc.iso8601 }
end

MyType = ::GraphQL::ObjectType.define do
  name 'MyType'
  field :when, type: !DateTimeType
end
0
nielsbot