graphql-ruby の v2.0.14リリースで one_of がサポートされたので紹介します。

oneOf について

  • 入力オブジェクトのうちいずれか1つだけのフィールドが指定されていることが保証される機能です
  • まだ公式仕様には含まれていませんが、GraphQL Working Group で議論されています
    • 現在は RFC(Request For Comments)で、実装やフィードバックを募集している段階のようです
  • graphql-ruby 等の一部のライブラリでは先行してサポートしているものがあるようです

  • 以下の場合 idusername のどちらか一方だけが指定されていることを意味します
  • input の型に @oneOf を付与します
input FindUserInput @oneOf {
  id: ID
  username: String
}
  • Input Objects 内では以下のように、どちらも required: false にします
class FindUserInput < Types::BaseInput
  one_of
  # Either `{ id: ... }` or `{ username: ... }` may be given,
  # but not both -- and one of them _must_ be given.
  argument :id, ID, required: false
  argument :username, String, required: false
end
  • 両方が指定されている場合や、どちらも指定されていない場合はエラーになります

参考