将 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 可以做的所有事情。

聚会有点晚了,但我希望这对你有所帮助。