Utilizzando Rails serialize per salvare hash nel database

Sto provando a salvare un hash mapping degli ID su una serie di tentativi nella mia app per rails. La mia migrazione al database per ospitare questa nuova colonna:

class AddMultiWrongToUser < ActiveRecord::Migration def self.up add_column :users, :multi_wrong, :string end def self.down remove_column :users, :multi_wrong end end 

Nel mio modello ho:

 class User < ActiveRecord::Base serialize :multi_wrong, Hash end 

Ma quando uso la console di rails per verificare ciò facendo:

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

L’output è falso. Cosa c’è che non va qui?

    Il tipo di colonna è sbagliato. Dovresti usare Testo invece di String. Pertanto, la tua migrazione dovrebbe essere:

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

    Quindi Rails lo convertirà correttamente in YAML per te (ed eseguirà una corretta serializzazione). I campi di stringhe sono di dimensioni limitate e conserveranno solo valori particolarmente piccoli.

    AGGIORNAMENTO:

    L’implementazione esatta dipenderà dal tuo database, ma PostgreSQL ora dispone di colonne json e jsonb che possono memorizzare in modo nativo i tuoi dati hash / object e permetterti di eseguire query su JSON con ActiveRecord !

    cambia la tua migrazione e il gioco è fatto.

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

    ORIGINALE:

    Per maggiori dettagli: rails docs && apidock

    Assicurati che la tua colonna sia :text e not :string

    Migrazione:

    $ rails g migration add_location_data_to_users location_data:text

    dovrebbe creare:

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

    La tua class sarebbe simile a:

     class User < ActiveRecord::Base serialize :location_data end 

    Azioni Disponibili:

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

    Più impressionante ?!

    utilizza l'archivio postgresql

     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 puoi impostare attributi sul campo serializzato

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

    Rails 4 ha una nuova funzione chiamata Store , quindi puoi facilmente usarla per risolvere il tuo problema. È ansible definire un accessorio per esso e si raccomanda di dichiarare la colonna del database utilizzata per lo store serializzato come testo, quindi c’è molto spazio. L’esempio originale:

     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'