2010-09-30 11 views
27

Estoy creando un observador AuditLog que vigila varios modelos.Rails 3 - Cómo crear un objeto JSON para almacenar en la base de datos

Me gustaría que el observador tenga un after_create, que crea un objeto JSON que está almacenado en una columna de base de datos. Contendrá datos como {photoid: 123, photoname: "asdasd", creator_id: "asdasd"} etc ...

En Rails, ¿cómo creo este tipo de objeto JSON y cómo lo inserto en el DB junto con otros campos no JSON?

Gracias

Respuesta

9

En primer lugar, sin duda la salida ActiveRecord serializar y ver si hace lo que se necesita: http://api.rubyonrails.org/classes/ActiveRecord/Base.html#method-c-serialize

Sin embargo, si necesita específicamente JSON (serializar utiliza YAML por defecto), entonces siempre se puede fingir con la mano.

Puede simplemente crear un hash en Ruby y luego llamar al to_json antes de asignarlo a su atributo de modelo.

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

Gracias, voy a probar esto. – AnApprentice

+0

¿Es seguro to_json? ¿He visto algunas publicaciones en las búsquedas de Google que a veces lo mencionan? ¿Alguna idea sobre eso? – AnApprentice

+0

Hay algunas arrugas cuando se usa 'to_json' en un objeto activerecord (se supone que se debe usar' as_json' o algo así), pero para serializar un hash simple, la codificación JSON es muy sencilla ... no hay mucho que salga mal . ¿Qué encontraste con Google? – tfe

57

Las versiones actuales de los rieles admiten la serialización json fuera de la caja. Defina su campo como una cadena (o texto) en la migración y luego:

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

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

Puede ser mejor definirlo como texto, de lo contrario, el límite de 255 caracteres puede causar problemas. – thesmart

+2

Si esto no funciona por alguna razón (todavía se ven cosas como '{\" abc \ ": \" 123 \ "}' cuando se graba el registro), ¿qué podría estar yendo mal? – K2xL

Cuestiones relacionadas