我喜欢冰沙的界面特性!
在sorbet文档中有一段将单例方法抽象。这似乎是反序列化和迁移(上转换)的一个很好的特性。
我的想法是在数据库中存储类型化结构的序列化版本。因为结构体可能随着时间的推移而演变,所以我还想提供一些功能,将结构体的旧序列化版本转换为当前版本。
实现这一点的方法是将类的名称、数据和版本保存到数据库中。假设这个结构体
class MyStruct < T::Struct
const :v1_field, String
const :v2_field, String
def self.version
2
end
end
数据存储中的旧序列化版本可能如下所示:
<表类> 类数据版本 tbody><<tr> 表类>
MyStruct
{"v1_field": "v1 value"}
1
我认为你想要extend VersionedStruct
而不是试图在类方法中做神奇的混合技巧。效果很好:
# typed: true
module VersionedStruct
extend T::Sig
extend T::Helpers
abstract!
sig { abstract.returns(Integer) }
def version; end
sig { abstract.params(payload: T::Hash[Symbol, T.untyped]).returns(T::Hash[Symbol, T.untyped]) }
def migrate(payload); end
end
class MyStruct < T::Struct
extend T::Sig
extend VersionedStruct
const :v1_field, String
const :v2_field, String
sig { override.returns(Integer) }
def self.version
2
end
sig { override.params(data: T::Hash[Symbol, T.untyped]).returns(T::Hash[Symbol, T.untyped]) }
def self.migrate(data)
return {} if data[:v2_field]
data.merge(v2_field: "default value")
end
end