将 Storext(或只是 Virtus)与嵌套数组或散列对象一起使用
Use Storext (or just Virtus) with nested array or hash objects
我有一个 postgres 数据库支持我的 Rails 应用程序 class 和一个 jsonb 列
class Product < AR::B
include Storext.model(data: {})
store_attributes :data do
thing_one String
thing_two Boolean # Not actually showing up in the `data` hash
foos FooCollection[Foo]
end
end
class FooCollection < Array
def <<(obj)
if Hash
super(Coupon.new(obj)
else
# Other coersions
end
end
end
class Foo
include Storext.model
attribute :id, Integer
attribute :price, Float
attribute :regular_price, Float
end
但是终端中的 Foo 正在返回 undefined method after_initialize for Foo:Class
有没有办法像 Virtus
一样嵌套 Storext
模型?如果是这样,是否有一种惯用的方法可以在嵌套的 classes 上添加验证? (放弃Storext,纯Virtus解决方案也能回答这个问题)
也许这是一个 A/B 问题,因为我刚刚将 Virtus 包含在 FooCollection 中,它也从 data
散列中消失了(我认为这很奇怪,因为 Storext
基于 Virtus
并且可以接受 Virtus
方法)。
Storext 仅为 type-cast 简单值创建。我自己还没有尝试过在 Virtus 中存储复杂的对象,我仍然不确定这是否应该成为 Storext 的一部分。虽然它在后台使用 Virtus,但我认为它不应该实现 Virtus 可以做的所有事情。
聚会有点晚了,但我希望这对你有所帮助。
我有一个 postgres 数据库支持我的 Rails 应用程序 class 和一个 jsonb 列
class Product < AR::B
include Storext.model(data: {})
store_attributes :data do
thing_one String
thing_two Boolean # Not actually showing up in the `data` hash
foos FooCollection[Foo]
end
end
class FooCollection < Array
def <<(obj)
if Hash
super(Coupon.new(obj)
else
# Other coersions
end
end
end
class Foo
include Storext.model
attribute :id, Integer
attribute :price, Float
attribute :regular_price, Float
end
但是终端中的 Foo 正在返回 undefined method after_initialize for Foo:Class
有没有办法像 Virtus
一样嵌套 Storext
模型?如果是这样,是否有一种惯用的方法可以在嵌套的 classes 上添加验证? (放弃Storext,纯Virtus解决方案也能回答这个问题)
也许这是一个 A/B 问题,因为我刚刚将 Virtus 包含在 FooCollection 中,它也从 data
散列中消失了(我认为这很奇怪,因为 Storext
基于 Virtus
并且可以接受 Virtus
方法)。
Storext 仅为 type-cast 简单值创建。我自己还没有尝试过在 Virtus 中存储复杂的对象,我仍然不确定这是否应该成为 Storext 的一部分。虽然它在后台使用 Virtus,但我认为它不应该实现 Virtus 可以做的所有事情。
聚会有点晚了,但我希望这对你有所帮助。