Поддерживает ли Virtus атрибуты Hash[SomeKey => Array[CustomModel]]?
Например:
class Nested
include Virtus.model
attribute :name, String
end
class Base
# Does not raise an exception even though the array failed to coerce!
include Virtus.model(:strict => true)
attribute :name, String
attribute :nested, Nested
attribute :array , Array[Nested]
attribute :hash, Hash[String => Nested]
attribute :hash_array_int, Hash[String => Array[Integer]]
attribute :hash_array, Hash[String => Array[Nested]] # attribute in question!
end
Если я попытаюсь создать несколько таких объектов:
a = Nested.new(name: "a")
b = Base.new(
name: "b",
nested: { name: "nested b" },
array: [{ name: "array 1" }, { name: "array 2" }],
hash: { "key": { name: "hash b" } },
hash_array_int: { "key": [1, 2, 3] },
hash_array: {
# The below fails to coerce the objects in the array
"key": [{ name: "hash_array 1"}, { name: "hash_array 2" }]
}
)
Каждый атрибут работает, кроме принуждения Array[Nested]
для :hash_array
, давая мне трассировку стека:
NoMethodError: undefined method `call' for nil:NilClass
from /.rvm/gems/ruby-2.2.4/gems/virtus-1.0.5/lib/virtus/attribute.rb:104:in `coerce'
from /.rvm/gems/ruby-2.2.4/gems/virtus-1.0.5/lib/virtus/attribute/collection.rb:79:in `block in coerce'
from /.rvm/gems/ruby-2.2.4/gems/virtus-1.0.5/lib/virtus/attribute/collection.rb:78:in `each'
from /.rvm/gems/ruby-2.2.4/gems/virtus-1.0.5/lib/virtus/attribute/collection.rb:78:in `each_with_object'
from /.rvm/gems/ruby-2.2.4/gems/virtus-1.0.5/lib/virtus/attribute/collection.rb:78:in `coerce'
from /.rvm/gems/ruby-2.2.4/gems/virtus-1.0.5/lib/virtus/attribute/hash.rb:110:in `block in coerce'
from /.rvm/gems/ruby-2.2.4/gems/virtus-1.0.5/lib/virtus/attribute/hash.rb:109:in `each'
from /.rvm/gems/ruby-2.2.4/gems/virtus-1.0.5/lib/virtus/attribute/hash.rb:109:in `each_with_object'
from /.rvm/gems/ruby-2.2.4/gems/virtus-1.0.5/lib/virtus/attribute/hash.rb:109:in `coerce'
from /.rvm/gems/ruby-2.2.4/gems/virtus-1.0.5/lib/virtus/attribute/coercible.rb:14:in `set'
from /.rvm/gems/ruby-2.2.4/gems/virtus-1.0.5/lib/virtus/attribute_set.rb:146:in `block in define_writer_method'
from /.rvm/gems/ruby-2.2.4/gems/virtus-1.0.5/lib/virtus/attribute_set.rb:173:in `block in set'
from /.rvm/gems/ruby-2.2.4/gems/virtus-1.0.5/lib/virtus/attribute_set.rb:170:in `each'
from /.rvm/gems/ruby-2.2.4/gems/virtus-1.0.5/lib/virtus/attribute_set.rb:170:in `set'
from /.rvm/gems/ruby-2.2.4/gems/virtus-1.0.5/lib/virtus/instance_methods.rb:17:in `initialize'
from (irb):2:in `new'
Таким образом, похоже, что coercer создается неправильно в https://github.com/solnic/virtus/blob/master/lib/virtus/attribute.rb#L104 через https://github.com/solnic/virtus/blob/master/lib/virtus/attribute/collection.rb#L79 и https://github.com/solnic/virtus/blob/master/lib/virtus/attribute/hash.rb#L110.
Прежде чем я погрузлюсь в откат своего собственного драгоценного камня для отладки этого, кто-нибудь знает о чистом обходном пути или я даже пытаюсь правильно установить вложенные отношения?