Ruby on Rails, generación de modelos y migraciones

El Modelo es el componente del patrón de diseño MVC (Modelo – Vista – Controlador) encargado del acceso a datos. La capa de Modelo comprende los objetos de negocio (tablas) almacenados en nuestras fuentes de datos (bases de datos o ficheros) además de definir la lógica de negocio y los accesos a las fuentes de datos.

Active Record es una libreria de clases que provee a la aplicación Rails de un modelo entidad-relación que sustituye al tradicional RDBMS (Sistema Administrador de Bases de Datos Relacionales). Active Record aprovecha el lenguaje y las convenciones de nombre Ruby para simplificar el acceso y la configuración de datos relacionados.

En este Post veremos como generar modelos y migraciones. Será en el siguiente Post donde nos meteremos mas en profundidad con las relaciones Active Record.


Active Record provee a nuestra aplicación Rails del código SQL y el archivo de Modelo en un sólo paso.

ruby script/generate model alumno

crea un modelo llamado alumno y que Rails supone englobará a la tabla alumnos. Al generar el modelo “alumno” ruby crea dos archivos:

  • app -> models -> alumno.rb y
  • db -> migrate -> 001_create_alumnos.rb.

Alumno.rb es el archivo de nuestro objeto de modelo alumno. Aquí, como veremos mas adelante, configuraremos en pocas líneas las validaciones y las relaciones entre la tabla alumnos y el resto de tablas de nuestra aplicación. Pero todo modelo necesita de una tabla con la que trabajar.

001_create_alumnos.rb es el archivo de migración de esquema que servirá para escribir la estructura de la tabla alumnos que vamos a crear en nuestra base de datos. En realidad, se puede crear la tabla mediante scripts SQL, o incluso ayudándonos de herramientas mas visuales tales como el phpMyAdmin. A fin de cuentas, de uno u otro modo lo que le estamos enviando a la base de datos es SQL. Sin embargo, la utilización de migraciones nos ofrecen algunas ventajas frente al medio tradicional.

La principal ventaja consiste en que la utilidad de migraciones de esquema de rails pueden volver a una u otra versión de nuestra tabla. En nuestro ejemplo, 001_create_alumnos.rb será – cuando escribamos y ejecutemos la migración – la primera versión de la tabla alumnos. En un futuro podrá tener otras migraciones asociadas a la tabla alumnos llamadas 002_create_alumnos.rb o 003_create_alumnos.rb en las que se hayan modificado el número de campos o incluso los propios datos.

Vamos a ver todo esto con un ejemplo sencillo.

Partamos de una nueva aplicación llamada “colegio”. Esta aplicación contará con una base de datos compuesta de tres tablas: clase, alumnos y profesores con las siguientes relaciones:

  • Cada clase está compuesta por distintos alumnos.
  • Cada alumno pertenece a una única clase.
  • Cada profesor imparte su asignatura en distintas clases.
  • Cada alumno tiene varios profesores.
  • Cada profesor tiene varios alumnos.

Damo por hecho que hemos creado nuestra base de datos “colegio” en MySQL y tenemos configurado correctamente nuestro archivo de acceso a la base de datos “database.yml” (config -> database.yml). Para refrescar la memoria echad un vistazo a este Post.

El siguiente paso sería la generación de un modelo por cada tabla. Vamos allá. Abrimos nuestra consola de Rails y escribimos:

ruby script/generate model Clase

ruby script/generate model Alumno

ruby script/generate model Profesor

Esto nos genera, como hemos visto dos archivos por cada modelo: el archivo de configuración del modelo y el archivo con la migración del esquema.

Arbol de la Estructura de Colegio App

Arbol de la Estructura de Colegio App

Este es el contenido de alumno.rb.

class Alumno < ActiveRecord::Base
end

Hasta ahora en este archivo tan sólo se define la clase Alumno. Gracias a las convenciones de nombre, Active Record “sabe” que la clase Alumno engloba una tabla de la base de datos llamada alumnos.

Y este es el contenido inicial de 002_create_alumnos.rb, el archivo donde se configura la migración para la tabla alumnos. En cuanto veamos un ejemplo, entenderemos mejor en que consiste todo esto de las migraciones.

class CreateAlumnos < ActiveRecord::Migration
def self.up
create_table :alumnos do |t|
end
end

def self.down
drop_table :alumnos
end
end

Si le echamos un vistazo, veremos que definimos la clase CreateAlumnos. Una clase que consta de dos métodos o acciones (en el idioma ROR); self.up y self.down. Mientras que en self.up se definen las acciones de creación y edición de la estructura de la tabla, self.down contendrá los métodos de eliminación.

Vamos a crear la estructura de las tres tablas (clases, alumnos y profesores) que componen nuestra base de datos “colegio”. Empezemos, ya que lo tenemos abierto, editando el archivo 002_create_alumnos.rb. Lo haremos agregando lo siguiente a lo ya escrito por Rails:

Creamos la estructura de la tabla alumnos

Creamos la estructura de la tabla alumnos

Lo que hemos conseguido con estas tres líneas de código es definir las 3 columnas de las que, de momento, consta la tabla alumnos (nombre, apellidos y dni; todas de tipo string). Como veremos después, la columna id, será agregada por Rails. El campo id es muy importante para Active Records ya que funciona, por defecto, como clave primaria de la tabla.

Vamos a completar las migraciones para las tablas clases y profesors. Daros cuenta de que el nombre que Rails le ha dado a la tabla donde se almacenarán los profesores del colegio se llama profesors y no profesores. Lamentablemente Rails está escrito en Inglés y la utilización que se hace de los plurales para definir el nombre de las tablas englobadas por cada clase no funciona bién con todas las palabras del español. Tan sólo deberemos conocer este pequeño problema y tener un poco de cuidado con esto.

Migración de la tabla profesors
Migración de la tabla clases

Migración de la tabla clases

Una vez completas las migracioines ya podemos ejecutarlas. Lo haremos por medio de la instruccion:

rake migrate

Por medio de esta instrucción, Rails explora el contenido del directorio db->migrate y ejecuta las instrucciones contenidas en cada archivo de migración.

Ejecución de rake migrate

Ejecución de rake migrate

Si le echamos un vistazo a nuestra base de datos “colegio” podremos ver como se han creado las tres tablas, cada una de ellas con la estructura que le hemos definido en nuestros archivos de migración.

Estructura base de datos colegio

Estructura base de datos colegio

Además de las tres tablas que hemos definido en las migraciones Rails añade otra tabla mas llamada schema_info, con un único campo llamado “version” en la que se almacena la versión actual de la migración. De este modo, Active Record podrá seguir el rastro de los cambios ralizados en el esquema de cada tabla.

Veamos también el aspecto de una de las tablas, alumnos por ejemplo, en el phpMyAdmin:

Tabla Alumnos

Tabla Alumnos

El siguiente paso que daremos será el de definir las relaciones entre las 3 tablas de nuestra base de datos. Para ello, habrá que modificar la estructura de nuestras tablas añadiendo, cuando sea necesario, las claves foraneas que hagan referencia a la/s tabla/s con las que existe alguna vinculación.

Pero esto será en el siguiente Post dedicado a Ruby on Rails. Continuaremos con este ejemplo.

Anuncios

2 Responses to Ruby on Rails, generación de modelos y migraciones

  1. Carlos dice:

    Muy bueno el tutorial..solo que faltan algunas cosas que ojala esten en la continuacion de este tales como referencias, llaves foraneas, etc.

  2. Aaron dice:

    Gracias me sirvio mucho su guía!

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: