serializers rails new fastjson fast active ruby-on-rails ruby serialization activerecord

ruby-on-rails - new - ruby on rails fast json



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

Intento guardar una identificación de asignación de hash en una serie de 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 rieles 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.


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''


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