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.

25 agosto, 2010

Mejorando el rendimiento: find_in_batches y find_each

Archivado en: Ruby on Rails,Tips&Tricks — xurdekio @ 8:09 am
Tags: , ,

Ruby on Rails no deja de sorprenderme con la cantidad de métodos útiles que te puedes encontrar por su API un día aburrido. En esta ocasión os traigo dos métodos para tratar grandes cantidades de registros sin saturar la memoria del servidor.

El primero es find_in_batches, que nos permite traer los registros de la base de datos en lotes, pudiendo pasarle condiciones de búsqueda, tamaño de los lotes, offset…

El segundo es find_each, que es un iterador aprovechando el método anterior.

Estos dos métodos nos permiten procesar simulatenamente en dos (o más) hilos todos los registros de la base de datos, pudiendo estar un worker con los registros del 0 al 10000, otro del 10000 al 20000… etc.

No hay que olvidarse de la nota al pie en la API, estos métodos estan orientados a grandes cantidades de datos, si sólo vas a tratar unos pocos usar el find normal!

Tema Rubric. Blog de WordPress.com.

Seguir

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