tengo una clase rieles modelo con un atributo Hash serializado, así:ActiveRecord convierte teclas de símbolos de cuerdas al serializar mi hash de
class Action
serialize :metadata, Hash
# . . .
end
Esa columna se almacena en una columna text
con una codificación YAML. El problema es que cuando paso un valor metadata
al método create!
, las claves hash se convierten de símbolos a cadenas, pero esa conversión no ocurre otras veces. Por ejemplo:
$ rails console
> a = Action.create!(:metadata => {:foo => "bar"})
> a.metadata
=> {"foo"=>"bar"}
> a.metadata[:fizz] = "buzz"
> a.metadata
=> {"foo"=>"bar", :fizz=>"buzz"}
Ahora al guardar el modelo, la base de datos va a tener este valor de texto:
---
foo: bar
:fizz: buzz
Alguna sugerencia de cómo solucionar este problema?
(Esto es con rieles 3.0.16.)
¿presenta la misma comportamiento con 'serialize: metadata, HashWithIndifferentAccess'? – gregates
@gregates: Lo intenté, y significa que puedo consultar el hash con cadenas o símbolos y obtener el valor, pero hay dos problemas: 'Action.create! (: Metadata => {: foo =>: barra}) 'plantea una excepción porque ya no puedo pasar Hash sin formato, y' Action.find (an_old_id) 'genera una excepción SerializationTypeMismatch porque Rails no sabe cómo convertir el YAML en un HashWithIndifferentAccess. –