備忘録+自分と同じくgraphql-rubyを上げないといけなくなった人への助けとして。
QiitaではGraphQLおよび、graphql-rubyを採用しています。
Ruby3.0へのアップデートの中で、graphql-rubyを最低でも1.11.7まで上げる必要があり、しばらくあげられていなかったgraqhql-rubyをエイヤッと上げることにしました。
その中で、CHANGELOGは一通り目を通して問題ないかは確認しましたが、コードを実際に書き換えた部分というのは限られています。
この記事ではどういうとこを書き換えたのかを簡易的にまとめていき、「こういうとこ影響あるかもしれないなと」いう修正の感所の参考にして貰えばと思います。
※以降サンプルコードが出てきますが、わかりやすくするために簡易にしたり、実際のプロダクトとは大きく実装が違う部分がありますがご了承ください。
1.8.2->1.8.15
特に書き変えが必要な変更はありませんでした。
1.8.15->1.9.21
- GraphQL::Schema::Objectを継承したクラスで、fieldのメソッド定義にobjectを呼びたい時
object
ではなくitself
と定義するようになりました。
class Hoge < GraphQL::Schema::Object
+ field :items, [type_class], 'A list of items', null: false, method: :object
- field :items, [type_class], 'A list of items', null: false, method: :itself
end
- GraphQL::Schema::Objectを継承したクラスのfieldの定義で、クラス内に定義したメソッドを使ってデータを呼び出す場合
method
ではなくresolver_method
を使うようになりました。
class Hoge < GraphQL::Schema::Object
- field :fuga, String, null: false, method: :fugafuga
+ field :fuga, String, null: false, resolver_method: :fugafuga
field :piyo, String, null: false
def fugafuga
#(略)
end
def piyo # 同じ名前なら field定義でmethodは不要
#(略)
end
end
1.9.21->1.10.12
- define_edge、define_connectionなどが廃止され、Class-based(原文ママ)に書き換えられるようになりました。
- これにより、Ruby側でEdgeを書かずに省略していたのを定義するなどの変更が生じています。
- fieldの方で整数型を示すのがIntegerに統一されました。
- class HogeConnection = HogeObject.define_connection do # 1.9以前はHogeEdgeをRuby上で作らなくてもよかった
- name 'HogeConnection'
+ class HogeConnection < GraphQL::Types::Relay::BaseConnection
+ edge_type (HogeEdge)
- field :totalCount, !types.Int, do
- resolve -> (obj, _args, _context) do
- obj.parent.length
- end
- end
+ field :total_count, Integer, null: false
+ def total_count
+ obj.parent.length
+ end
end
+ class HogeEdge < GraphQL::Types::Relay::BaseEdge
+ node_type HogeObject
+ end
1.10.12 -> 1.11.7
- mutationなどのfield定義でキャメルケースでfield名が書かれている場合、スネークケースに直す必要があります。
HogeMutation < GraphQL::Schema::RelayClassicMutation
graphql_name 'Hoge'
- argument :hogeId, String, required: true
+ argument :hoge_id, String, required: true
- field :hogeFuga, String, null: false
+ field :hoge_fuga, String, null: false
def resolve(**inputs)
# (略)
end
end
1.11.7 -> 1.12.16
- Qiitaのソースコードでは変更が必要な点はありませんでした。
まとめ
今回はQiitaのgraphql-rubyのアップデートでこういうところを修正したよ、というのをまとめてみました。
graphql-rubyを採用しているrailsプロダクトは多く、ruby2.7のEOLが近づいてきたことで急遽上げないといけなくなるプロダクトも少なくはないと思うので、誰かの助けになればと思います。
また、Qiitaではたまたま対象になってないBreaking Changeは多々あるので、これを読んで満足するのではなく実際にCHANGELOGや気になる部分のソースコードを読んでみてください。
※もしCHANGELOGの誤訳などにより、間違いを書いていた場合優しく編集リクエストを送ってもらえると幸いです。