在graphql-ruby升级时遇到的问题(从1.8升级到1.12)

作为帮助那些不得不使用graphql-ruby的人的备忘录。

在Qiita中,我们采用了GraphQL和graphql-ruby。
在将Ruby升级到3.0的过程中,我们需要将graphql-ruby至少升级到1.11.7,因此我们决定赶紧升级一下之前没升级的graphql-ruby。
在这个过程中,我们确认了CHANGELOG并且通过了一次整体审查,但实际修改的代码部分是有限的。

希望这篇文章能简要总结出哪些地方进行了改写,并作为修正的参考,让读者知道可能产生的影响。

※以下会出现示例代码,为了简化易懂起见,代码可能会有所简略,且与实际产品的实现存在较大区别,请予以谅解。

1.8.2转变为1.8.15

没有特别需要修改的更改。

1月8日至1月9日

    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日至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

1月10日 -> 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
1.11.7 变为 1.12.16

    Qiitaのソースコードでは変更が必要な点はありませんでした。

整理

这次在Qiita的graphql-ruby更新中,我总结了修复的部分。有很多采用graphql-ruby的Rails项目,我认为由于ruby2.7的EOL(即将停止维护)临近,有些项目需要紧急升级,因此希望能对他人有所帮助。另外,请不要仅仅满足于阅读这篇文章,因为在Qiita中还存在很多未被包含的Breaking Change,请尝试阅读CHANGELOG或是有兴趣的源代码部分。

如果CHANGELOG翻译错误或有任何错误,请您友善地发送编辑请求,将不胜感激。

广告
将在 10 秒后关闭
bannerAds