2016-04-28 6 views
2

У меня есть Postgres БД, поддерживая мой Rails приложения с классом с колонкой jsonbИспользование Storext (или просто Virtus) с вложенными массив или хэш-объекты

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

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

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

ответ

0

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

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

+1

Для чего Виртус тоже был слишком жестким (или, возможно, я не знал, как использовать Virtus достаточно хорошо) для того, что я пытался сделать. Итак, я просто написал что-то обычай. Приятно видеть, что это не так, как это должно работать, потому что это всегда страх, я не понимаю X или не просто ли это делает? – MCB

+1

Да, также, это усложняет код :) Классно рад слышать, что вы нашли решение. –