Ejemplo de relaciones de tablas en Rails

Hoy vamos a ver como replicar estas relaciones entre tablas, las de la imagen, en rails, vamos a crear las tablas, y establecer las relaciones entre ellas. Vamos a tener cuatro tablas:

esquema bbdd

  • nombres
  • administradores
  • direcciones_ip
  • servidores

El objetivo es poder definir las relaciones de forma que un administrador es una persona que tiene nombre y apellidos, ese administrador puede gestionar varios servidores, los cuales a su vez pueden ser gestionados por varios administradores, y cada servidor puede tener varias direcciones IP, pero cada dirección IP sólo puede estar en un servidor y en un interfaz.3

Si nos fijamos bien hay otra relación que no está definida entre tablas que es dirección IP e interfaz, es una relación uno a uno y como tal se puede incluir en una misma tabla, pero para nuestro ejemplo hemos separado administradores y el nombre de los mismos.

Lo primero que vamos a hacer como crear el proyecto, crear la base de datos, dar permisos a un usuario, configurar acceso al mysql en rails y crear las tablas, así que vamos a hacerlo todo seguido.

Una vez hecho esto ya podemos concentrarnos en las relaciones, ya que lo único que hemos hecho ha sido crear las tablas vacías con los campos que se indicaban en el diagrama.

Ahora vamos a meter unos datos dummy en la base de datos para empezar a trabajar, para ello desde la consola de rails entrando como rails console desde el directorio raiz del proyecto:

La tabla de administradores sólo tiene una columna que es ID, por eso no hemos rellenado nada después iremos creando según lo necesitemos, así que ya podemos empezar a trabajar.

Relación uno a uno

Entre las tablas nombres y administradores tenemos una relación uno a uno y vamos a decir que nombre tiene un administrador y que un administrador pertenece a un nombre, así que editamos ambos modelos:

En la clase Administrador le hemos dicho que pertenece a nombre, es decir, es una llave foránea a la llave de la tabla nombre, así que tenemos que crear esa columna en la base de datos:

Y ejecutaremos el migrate

Si fueramos atrás en versiones y volvieramos tendríamos que volver a introducir los datos dmmy que hemos puesto antes, ya que se borrarían las tablas con drop y al recrearlas lo haría sin contenido.

En este momento entraríamos en la consola de rails para crear las cuatro relaciones uno a uno de nombre y administrador

Se ve más claro si vemos la tabla directamente en MySQL como se ha rellenado la columna nombre_id

Relación uno a muchos

Ahora vamos a ver la relación entre servidores y direcciones IP. Un servidor puede tener varias direcciones IP, pero cada dirección IP sólo puede estar en un servidor.

Aquí hay que decir que los métodos disponibles son los siguientes:

  • servidor.direccion_ip
  • servidor.direccion_ip << direccion_ip (añadir al array)
  • servidor.direccion_ip = direccion_ip, direccion_ip (introducimos todo el array)
  • servidor.direccion_ip.delete(direccion_ip) (borramos el objeto)
  • servidor.direccion_ip.destroy(direccion_ip) (borramos el objeto y de la base de datos)
  • servidor.direccion_ip.clear (borramos todo)
  • servidor.direccion_ip.empty? (preguntamos si está vacío el array)
  • servidor.direccion_ip.size (preguntamos el tamaño del array)

Si lo trasladamos a lenguaje Rails tenemos que un servidor has_many :direccionesip

Así procedemos a configurar el fichero

Y como tenemos belongs_to en direccion_ip significa que tenemos que crear una Foreign Key apuntando a servidor mediante una nueva migración

 

Y entramos en la consola de rails. Vamos a asignar todas las IPs que tenemos en los datos dummy al primer servidor

Y si vemos en MySQL vemos que todas las IPs se han asignado al servidor_id 1, es decir, al primero:

Relación muchos a muchos

Para establecer esta relación y cumplir las formas normales es necesario crear una tabla join intermedia. Esta tabla estará compuesta únicamente por las dos claves foráneas y no tendrá tampoco la clave primaria (id) que crea por defecto Rails, así que habrá que quitársela con :id => false en la migración.

El nombre de la tabla será igual al nombre de las dos tablas unidas por guión y dispuestas por orden alfabético, en nuestro caso será administradors_servidors (el plural este tan raro es el que hace Rails añadiendo simplemente una s)

En el index hemos tenido que añadir

porque nos daba este error en el rake db:migrate

Ahora en los dos modeles involucrados tendremos que poner has_and_belongs_to_many :el_otro_modelo.

Y ahora vamos introduciendo datos a base de buscar un administrador, un servidor y enlazarlos

En MySQL se vería así:

 

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *