在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翻译错误或有任何错误,请您友善地发送编辑请求,将不胜感激。