Rails:如何使用序列化属性和Sorbet



我找不到任何关于如何处理serialized列属性的例子。

class MyClass < ApplicationRecord
serialize :related_pages, Array
end

本例中为String(如T::Array[String])的Array

我找到的唯一解决方案是转换它:T.cast(related_pages, T::Array[String])

这是最好的解决方案吗?

不幸的是,我不认为有一个很好的方法自动得到你现在想要的。我想说使用Tapioca,但它看起来会为serialize调用生成无类型的getter和setter,这对您没有帮助。如果你对Tapioca有信心,我想你可以编写自己的DSL编译器,但这是它自己的问题。

也就是说,有一种不涉及T.cast的手动方法可以解决这个问题:您可以编写自己的.rbi文件。它有一些问题(例如,你必须自己保持它们同步,你基本上是在断言类型检查器,你知道你在做什么),但这是一种可能性!

对于你的,我认为它看起来像这样(我还没有运行这个;这只是为了说明):

# typed: strict
class MyClass
extend T::Sig
sig { returns(T::Array[String]) }
def related_pages; end
sig { params(value: T::Array[String]).returns(T::Array[String]) }
def related_pages=(value); end
# whatever other helper methods you need like `related_pages_before_last_save` etc
end

相关内容

  • 没有找到相关文章

最新更新