rescue true

28 septiembre, 2010

Salvando hashs, arrays y otros objetos no mapeables en columnas de texto

Filed under: ActiveRecord,Ruby on Rails — xurdekio @ 12:00 pm
Tags: , , , , ,

Para hoy algo realmente interesante, que cuando lo ves te acuerdas de aquel proyecto en el que te hubiese venido genial saberlo.
En muchas ocasiones tenemos un hash de opciones, o un array con varios valores que nos gustaría salvar junto con el objeto, pero no hay ninguna estructura de base de datos que se acople a el.
Por ejemplo un usuario que tiene configuraciones sobre cuando quiere recibir emails. Lo ideal seria tener un hash de la siguiente manera:

 alert_me_on = {:new_message => true, :new_event => false, :new_board_message => true}

Para guardar esto en base de datos necesitaríamos 3 columnas en la tabla del usuario o bien una nueva tabla con las 3 columnas y la foreign key del usuario.
Sin embargo Rails nos permite guardar el hash tal cual en una columna de texto, utilizando para ello serialize:

 class User < ActiveRecord::Base
   serialize :alert_me_on, Hash
 end
 u = User.new
 u.alert_me_on = {:new_message => true, :new_event => false, :new_board_message => true}
 u.save
 u.alert_me_on[:new_message] #=> true

Realmente cómodo, y sirve también para arrays, structs… etc. Espero que no lo conocierais!

Edito: La solución es cómoda cuando NO vamos a realizar búsquedas por ese campo. Es decir si necesitamos traer todos los usuarios que requieren una notificación en concreto estamos ralentizando la búsqueda respecto a un campo booleano.

Blog de WordPress.com.