【GraphQL Ruby】InputObjectのField参照について

graphql-rubyではFieldとして引数をとることができます。さらに引数を定義するための型として、以下があります。

  • Scalar
  • Enum
  • InputObject
  • List
  • NonNull

特にInputObjectに関して、オブジェクトに定義されたFieldを参照する方法として

  • メソッドとして参照する方法
  • #[]としてSymbolで参照する方法

が用意されていますが、参照方法が2通りある背景と使い分けについて整理しておきたいと思います。

参照方法が2通りある背景

graphql-rubyのInputObjectに関する公式ドキュメントを見てみると「Using Input Objects」の欄に

  • calling its method, corresponding to the name (underscore-cased)
  • calling #[] with the camel-cased name of the argument (this is for compatibility with previous GraphQL-Ruby versions)

とあり、#[]は前バージョンとの後方互換性のためのものであるようです。

#[]による参照は非推奨なのでしょうか?もう少し調べたいと思います。

graphql-rubyChangelogに参照方法の変更に関しての記述がありました。

  • calling its method, corresponding to the name (underscore-cased)
  • Field arguments may be accessed as methods on the args object. This is an alternative to #[] syntax which provides did-you-mean behavior instead of returning nil on a typo. #924 For example:

...The old syntax is not deprecated.

# using hash syntax:
args[:limit]    # => 10
args[:limittt]  # => nil
# using method syntax:
args.limit      # => 10
args.limittt    # => NoMethodError
  • Hash形式の参照時にタイポなどで未定義のFieldへのアクセスした場合にnil値を返すのではなく、NoMethodErrorにするための機能であること
  • 旧式(Hash形式での参照方法)も今の所、非推奨ではない

ことが分かりました。

使い分け

  • Changelogにもあるように、タイポに気づきやすくする
  • 後のアップデートで非推奨になる可能性がある

ことから、基本的にメソッドによるFieldの参照(args.limit)を行う方法で実装するとよさそうです。


参考

https://graphql-ruby.org/fields/arguments.html https://github.com/rmosolgo/graphql-ruby/blob/93ecc6d8c21606a571d0c87c6e3430b71b5acd84/CHANGELOG.md#170-18-sept-2017 https://graphql-ruby.org/type_definitions/input_objects.html#using-input-objects https://graphql-ruby.org/api-doc/2.0.20/GraphQL/Schema/InputObject#[]-instance_method