Help us understand the problem. What is going on with this article?

【Rails】GraphQL-Ruby いい感じでバックエンドに値を渡したい

やりたいこと

JavaScriptで言う所の、連想配列のようなデータを動的にRailsサーバーに渡したいと考えた。

参考サイト

【公式】
http://graphql-ruby.org/

【InputObjectType】
http://graphql-ruby.org/type_definitions/input_objects.html

【ListType】
http://graphql-ruby.org/type_definitions/lists.html

【ScalarType】
http://graphql-ruby.org/type_definitions/scalars.html

【EnumType】
http://graphql-ruby.org/type_definitions/enums.html

InputObjectTypeとList使いこなせたら、困らなくなりそう...!?

実装方法

  • ①InputObjectTypesで連想配列の形を整える。
base_input_object.rb
class Types::BaseInputObject < GraphQL::Schema::InputObject
end
products.rb
class Types::Products < Types::BaseInputObject
  # 連想配列をイメージ
  argument :team_id, ID, required: true
  argument :ages, [Int], required: true
  argument :prices, [Int], required: true
end

※例のargumentはイケてないです...

  • ②Mutation又は、QueryTypeの引数にInputTypeObjectをListで指定する。
craete_production_mutation.rb
class Mutations::CreateProductionMutation < Mutations::BaseMutation
  null false 

  argument :company_id, Int, required: false
  argument :products, [Types::Products], required: false

  field :save_complete, Boolean, null: false
  field :errors, [String], null: false

  def resolve(company_id:, products:)
    save_complete = true
    # トランザクションの処理とかsaveの処理
    { save_complete: save_complete }
  end
end

Enumについて

  • 外部キーに、Enumは使用しない。 1 .GraphQLで実現しずらい。
  • そして、マスタとしてテーブルがあるので、

Enumを使って、

TeamMember.team_member_authority_id
# => "社長"

とするよりも、

TeamMember.team_member_authority.name
# => "社長"

とする方が、テーブル設計としていいような気がした。
仮に、外部キーにenumを使って、意味を持たせるのであれば、マスタテーブルの必要性が薄くなる。
enumを使って、表現する場合は、そのテーブル内で完結できる情報を持たせる。
詳細は随時追記

課題

javascriptでJSON.stringifyして渡そうとしても、エラーになった
JSONをScalarTypeで定義しているGitHubissueがあったが、GraohQLの思想とあっているか不明
よくわからない...

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away