Ruby on Rails, parte 13: Introducción a ActiveRecord

Como dije en el anterior posteo, ActiveRecord es un ORM, los ORM nos permiten hacer consultas a la base de datos a través de objetos. Esto tiene muchas ventajas, una de ellas es que nos desligamos de la necesidad de tener que escribir código SQL utilizando una sintaxis propia del lenguaje que termina siendo mucho más amigable.

Para este proyecto que estuvimos creando en los dos últimos posteos llamado organizador creamos dos modelos y por ende dos tablas. Uno de estos modelos se llama Tarea y dijimos que está relacionado con la tabla tareas. Nuestra clase Tarea heredará de la clase ActiveRecord, y ésta nos proveerá una serie de métodos para realizar consultas a la tabla tareas.

Insertar registros

Para crear un nuevo registro en la base de datos nosotros podemos utilizar dos métodos heredados de ActiveRecord. .save() y .create().

Método .save():

@tarea = Tarea.new({
   :titulo => "Título de prueba",
   :descripcion => "Descripción de prueba",
   :prioridad => 1,
   :activo => true
});
@tarea.save();

En primer término creamos un nuevo objeto de la clase Tarea con el método .new(). Dentro debemos pasarle como parámetro un hash con las columnas y los valores que vamos a insertar. Finalmente con el método .save() realizamos el insert para crear un nuevo registro.

Método .create():

@tarea = Tarea.create({
   :titulo => "Título de prueba 2",
   :descripcion => "Descripción de prueba 2",
   :prioridad => 2,
   :activo => true
});

El método .create() recibe también un hash con los valores nuevos a insertar y automáticamente realiza el insert.

Si bien ambos métodos nos permiten insertar nuevos registros, la diferencia entre ambos es que .save() también puede utilizarse para modificar registros. Ya veremos en esta misma publicación cómo hacerlo.

Recuperar un registro por su id

Es típico que la forma de recuperar registros en la base de datos sea por su id o clave primaria. Cómo dije en el anterior posteo al crear tablas en RoR automáticamente se generará una columna id  que será la clave primaria sin la necesidad de que nosotros tengamos que setearlo manualmente. Ahora bien ActiveRecord nos provee de un método para recuperar todos los valores de un registro a través de su id llamado .find().

Por ejemplo si quisiéramos recuperar la tarea con el id 1 deberíamos hacer esto:

@tarea = Tarea.find(1);

Con esto es más que suficiente. El método .find() nos devolverá un objeto con los valores de sus respectivas columnas. Por tanto si quisiéramos recuperar el título de una tarea deberíamos hacer esto:

@tarea = Tarea.find(1);
@titulo = @tarea.titulo;

Y así con el resto de las columnas.

Modificar registros

Para modificar registros existentes en la base de datos podemos utilizar los métodos .save() o .update_attributes().

Con el método .save():

@tarea = Tarea.find(1);
@tarea.titulo = "Título modificado";
@tarea.descripcion = "Descripción modificada";
@tarea.prioridad = 7;
@tarea.activo = false;
@tarea.save();

Como ves debemos utilizar también el método .find() para recuperar el registro que vamos a modificar en forma de objeto por su id. Luego debemos setearle los valores nuevos (no es necesario cambiarle todas las columnas) y al final utilizar el método .save() para modificar el registro.

Con el método .update_attributes() :

@tarea = Tarea.find(1);
@tarea.update_attributes({
   :titulo => "Título modificado",
   :descripcion => "Descripción modificada",
   :prioridad => 7,
   :activo => false
});

En este caso se produce lo mismo que lo anterior. La diferencia con el método .save() como dije antes es que éste también sirve para insertar registros.

También podemos modificar múltiples registros con el método .update_all() dependiendo si se cumplen ciertas condiciones. Por ejemplo:

@tareas = Tarea.update_all(
   {:activo => false},
   {:titulo => "Sin título"},
 );

Este método recibe dos parámetros el primero son las columnas a modificar y el segundo las condiciones. En este último caso modificará la columna activo a false (0) en todos los registros que tengan como valor del título “Sin título”.

Eliminar registros

Para eliminar un registro debemos recurrir al método .destroy():

@tarea = Tarea.find(1);
@tarea.destroy();

Si queremos eliminar uno o múltiples registros dependiendo de si se cumplan determinadas condiciones podemos usar el método .destroy_all() de esta forma:

@tareas = Tarea.destroy_all(
   {:activo => false}
 );

En este caso recibirá un hash con las condiciones para eliminar los registros.

Seleccionar registros

Bueno, como ya vimos con el método .find() podemos recuperar un registro en la base de datos por su id. Pero también podemos recuperar uno o más registros dependiendo de determinadas condiciones. Con el método .all() podemos recuperar todos los registros y sus respectivos valores en una tabla:

@tareas = Tarea.all();

También podríamos crear consultas un poco más trabajadas como:

@tareas = Tarea.select("titulo, descripcion").where(:activo => true).order("titulo").limit(3);

En este último caso recuperaremos solamente el título y la descripción de cada registro pero con la condición de que la columna :activo sea true (en criollo que sea 1) ordenadas por el título y las 3 primero.

Bueno, ahora que tenemos un poco más claro como trabaja ActiveRecord en el próximo posteo continuaremos con nuestra pequeña aplicación.

Saludos!

Anterior: Ruby on Rails, parte 12: Modelos y migraciones

Siguiente: Ruby on Rails, parte 14: CRUD y REST

Redes sociables