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