Используйте 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.
Немного опоздал на вечеринку, но надеюсь, это поможет.