我找不到任何关于如何处理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