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.