Intento guardar un ID de mapeo hash en varios intentos en mi aplicación de rieles. Mi migración a la base de datos para acomodar esta nueva columna:
class AddMultiWrongToUser < ActiveRecord::Migration
def self.up
add_column :users, :multi_wrong, :string
end
def self.down
remove_column :users, :multi_wrong
end
end
En mi modelo tengo:
class User < ActiveRecord::Base
serialize :multi_wrong, Hash
end
Pero cuando uso la consola de rails para probar esto haciendo:
user = User.create()
user.multi_wrong = {"test"=>"123"}
user.save
La salida es falsa. ¿Qué está pasando mal aquí?
ruby-on-rails
ruby
serialization
activerecord
cmwright
fuente
fuente
Respuestas:
El tipo de columna es incorrecto. Debería usar Texto en lugar de Cadena. Por lo tanto, su migración debería ser:
Entonces Rails lo convertirá correctamente en YAML para usted (y realizará la serialización adecuada). Los campos de cadenas tienen un tamaño limitado y solo contendrán valores especialmente pequeños.
fuente
ACTUALIZADO:
Aplicación exacta dependerá de su base de datos, pero ahora tiene PostgreSQL
json
yjsonb
columnas que pueden almacenar de forma nativa sus datos de hash / objeto y que permitan a consulta en la JSON con ActiveRecord !cambia tu migración y listo.
ORIGINAL:
Para más detalles: rails docs && apidock
Asegúrese de que su columna sea
:text
y no:string
Migración:
$ rails g migration add_location_data_to_users location_data:text
debería crear:
Tu clase se vería así:
Acciones disponibles:
¿Más impresionante?
utilizar postgresql hstore
Con hstore puede establecer atributos en el campo serializado
fuente
Rails 4 tiene una nueva característica llamada Store , por lo que puede usarla fácilmente para resolver su problema. Puede definir un descriptor de acceso para él y se recomienda que declare la columna de la base de datos utilizada para la tienda serializada como un texto, por lo que hay mucho espacio. El ejemplo original:
fuente