rescue true

28 septiembre, 2010

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

Archivado en: 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.

31 agosto, 2010

Trabajando en Rails con tablas de otros esquemas

Archivado en: Ruby on Rails,Tips&Tricks — xurdekio @ 11:19 am
Tags: , , , ,

Cuando trabajamos en proyectos grandes, en múltiples ocasiones podemos necesitar acceder a diferentes tablas en diferentes esquemas. En algunos lenguajes esto puede ser un caos de configuraciones, sin embargo en Rails podemos configurar la tabla para el modelo en otro esquema con una sola línea en nuestro modelo:

class Customer < ActiveRecord::Base
  set_table_name 'other_schema.customers'
end

Puede parecer una tontería pero es muy útil para hacer cargas de contenidos desde viejos proyectos, probar inconsistencias en base de datos respecto a la base de datos de producción y de desarrollo sin falta de tener varios servidores arrancados, etc.

Tema Rubric. Blog de WordPress.com.

Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.