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-rubyのChangelogに参照方法の変更に関しての記述がありました。
- 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 returningnil
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