Используйте Storext (или просто Virtus) с вложенными массивами или хеш-объектами

У меня есть postgres DB, поддерживающая мое Rails-приложение с классом со столбцом 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

Но Фу в терминале возвращается undefined method after_initialize for Foo:Class

Есть ли способ вложить Storext модели так же, как с Virtus? И если так, есть ли идиоматический способ добавить проверки для вложенных классов? (Отказ от Storext, и чистое решение Virtus также ответит на вопрос)

Может быть, это проблема A/B, потому что я только что включил Virtus в FooCollection, и он также исчез из data хэш (который я считаю странным, так как Storext основывается на Virtus и может принять Virtus методы).

1 ответ

Решение

Storext был создан только для простых типов значений. Я сам не занимался хранением сложных объектов в Virtus, и я до сих пор не решил, должно ли это быть частью Storext. Хотя он использует Virtus в фоновом режиме, я не думаю, что он должен реализовывать все, что может сделать Virtus.

Немного опоздал на вечеринку, но надеюсь, это поможет.

Другие вопросы по тегам