9
1

More than 1 year has passed since last update.

graphql-rubyアップデートで引っかかった点(1.8->1.12)

Last updated at Posted at 2022-12-11

備忘録+自分と同じく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の誤訳などにより、間違いを書いていた場合優しく編集リクエストを送ってもらえると幸いです。

9
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
1