2010-09-30 3 views
27

Sto creando un osservatore AuditLog che controlla più modelli.Rails 3 - Come creare un oggetto JSON da memorizzare nel database

Mi piacerebbe che l'osservatore abbia un after_create, che crea un oggetto JSON che è memorizzato in una colonna del database. Conterrà dati come {photoid: 123, photoname: "asdasd", creator_id: "asdasd"} ecc ...

In Rails, come creo questo tipo di oggetto JSON e come lo inserisco in il DB insieme ad altri campi non JSON?

Grazie

risposta

9

In primo luogo, sicuramente check out ActiveRecord serializzare e vedere se lo fa quello che vi serve: http://api.rubyonrails.org/classes/ActiveRecord/Base.html#method-c-serialize

Tuttavia, se avete bisogno di JSON specifico (serialize usa YAML per impostazione predefinita), allora si può sempre fingere a mano.

È possibile semplicemente creare un hash in Ruby e quindi chiamare to_json su di esso prima di assegnarlo all'attributo del modello.

data = { 'photoid' => 123, 'photoname' => "asdasd", 'creator_id' => "asdasd" } 
myrecord.stored_data = data.to_json 
myrecord.save 
+0

Grazie, ci proverò. – AnApprentice

+0

È to_json sicuro? Ho visto alcuni post su Google Ricerche che menzionano a volte fallire? Qualche idea su questo? – AnApprentice

+0

Ci sono alcune grinze quando usi 'to_json' su un oggetto activerecord (dovresti usare' as_json' o qualcosa del genere), ma per serializzare un semplice hash è davvero semplice codifica JSON ... non c'è molto da sbagliare . Cosa hai trovato con Google? – tfe

57

Le versioni correnti dei binari supportano la serializzazione json fuori dalla scatola. Definire il campo come una stringa (o testo) nella migrazione e quindi:

class Foo < ActiveRecord::Base 
    serialize :field, JSON 
end 

bar = Foo.new 
bar.field = [1,2,3] 
bar.save 
+19

Potrebbe essere meglio definirlo come testo, altrimenti il ​​limite di 255 caratteri potrebbe causare problemi. – thesmart

+2

Se questo non funziona per qualche motivo (vedendo ancora cose come '{\" abc \ ": \" 123 \ "}' quando il record è jsonificato), cosa potrebbe andare storto? – K2xL