Utilizar Rails serializar para guardar el hash en la base de datos

Intento guardar una identificación de asignación de hash en una serie de bashs en mi aplicación de Rails. 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, hago lo siguiente:

 user = User.create() user.multi_wrong = {"test"=>"123"} user.save 

El resultado es falso. ¿Qué está mal aquí?

El tipo de columna es incorrecta. Deberías usar Text en lugar de String. Por lo tanto, tu migración debería ser:

  def self.up add_column :users, :multi_wrong, :text end 

Entonces Rails lo convertirá apropiadamente en YAML por usted (y realizará la serialización adecuada). Los campos de cadenas tienen un tamaño limitado y solo tendrán valores especialmente pequeños.

ACTUALIZADO:

La implementación exacta dependerá de su base de datos, pero PostgreSQL ahora tiene columnas json y jsonb que pueden almacenar de forma nativa sus datos hash / objeto y le permiten consultar contra el JSON con ActiveRecord .

cambie su migración y listo.

 class Migration0001 def change add_column :users, :location_data, :json, default: {} end end 

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:

 class Migration0001 def change add_column :users, :location_data, :text end end 

Tu clase se vería así:

 class User < ActiveRecord::Base serialize :location_data end 

Acciones disponibles:

 b = User.new b.location_data = [1,2,{foot: 3, bart: "noodles"}] b.save 

Más impresionante ?!

utilizar postgresql hstore

 class AddHstore < ActiveRecord::Migration def up enable_extension :hstore end def down disable_extension :hstore end end class Migration0001 def change add_column :users, :location_data, :hstore end end 

Con hstore puede establecer atributos en el campo serializado

 class User < ActiveRecord::Base # setup hstore store_accessor :location_data, :city, :state end 

Rails 4 tiene una nueva característica llamada Store , por lo que puedes usarla fácilmente para resolver tu 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:

 class User < ActiveRecord::Base store :settings, accessors: [ :color, :homepage ], coder: JSON end u = User.new(color: 'black', homepage: '37signals.com') u.color # Accessor stored attribute u.settings[:country] = 'Denmark' # Any attribute, even if not specified with an accessor # There is no difference between strings and symbols for accessing custom attributes u.settings[:country] # => 'Denmark' u.settings['country'] # => 'Denmark'