Asociaciones
Las asociaciones se utilizan para definir relaciones entre tablas de una base de datos. Existen dos tipos de asociaciones que se pueden modelar en una base de datos relacional:
One to many (uno a muchos)
Many to many (muchos a muchos)
Recuerda, como siempre, que puedes continuar con la aplicación que estás trabajando o clonar el proyecto y ubicarte en la rama de este capítulo ejecutando los siguiente comandos:
One to many (uno a muchos)
En una relación uno a muchos cada registro de una tabla está relacionado a un registro de otra tabla.
Por ejemplo, imagina que cada libro pertenece a una única categoría.
El primer paso es crear el modelo Category
:
Ahora vamos a crear una migración para asociar el modelo Book
a Category
, es decir, debemos crear un campo category_id
en books
:
Fíjate que en vez de crear el campo con category_id:integer
estamos utilizando category:references
. La razón es que de esta forma Rails nos ahorra un par de pasos:
Crear un índice sobre ese campo, que es importante para que las búsquedas de libros por categoría sean muy rápidas.
Agregar la siguiente línea al modelo
Book
:
Por último, debemos agregar la siguiente línea al modelo Category
(esto si lo debemos hacer manualmente), :
Veamos ahora las acciones comunes que se realizan con las relaciones uno a muchos. Primero creemos algunas categorías:
Y asocia los libros que tengas con alguna de estas categorías, por ejemplo:
Veamos ahora otras acciones comunes que se realizan con una asociación uno a muchos.
Obtener la categoría de un libro
Ver los libros de una categoría
Crear libros de una categoría
Existen tres formas en que puedes crear un libro relacionado con la categoría:
Many to many (muchos a muchos)
En nuestra aplicación de libros definimos los autores de un libro en un campo llamado authors
. Sin embargo, sería mucho mejor tener una tabla de autores independiente de la tabla de libros. Un libro puede tener muchos autores y un autor puede tener muchos libros. Es una relación muchos a muchos.
Nota: No vamos a implementar esta asociación en nuestra aplicación, sólo vamos a explicar cómo se haría.
Una asociación muchos a muchos es un tipo de asociación en donde un registro de una tabla puede estar relacionada a muchos registros de otra otra tabla. Para definir una relación muchos a muchos se debe crear una tabla intermedia que relacione las dos tablas.
Imagina que la tabla authors
tiene los siguientes registros:
Imagina también que la tabla books
tiene los siguientes registros:
Para relacionar autores con libros necesitamos una tabla adicional. Para nombrarla se utiliza la combinación de los dos nombres de las tablas separados por raya al piso (_
). En este ejemplo el nombre sería authors_books
(también podría llamarse books_authors
pero por notación se utiliza el orden alfabético).
La tabla authors_books
tendría la siguiente estructura:
¿Qué libros están asociados al autor Pedro? ¿Qué libro tiene dos autores?
A la tabla intermedia se le conoce como una join table.
Para implementar esta asociación primero debes crear el modelo Author
:
Ahora creemos la tabla intermedia con una migración. Esta tabla no tiene un modelo asociado:
Por último, debemos agregar has_and_belongs_to_many
a los dos modelos:
Creemos algunos autores primero:
Veamos ahora las acciones comunes que se realizan con las relaciones muchos a muchos:
Relacionar un libro a un autor y viceversa (autores a libros)
No es necesario volver a guardar el modelo. La última línea hace el INSERT en la tabla intermedia. Lo podemos hacer al revés (relacionar el libro al autor) y tendríamos el mismo resultado.
Si estamos creando un libro y queremos asociarle de una vez algunos autores podemos hacer lo siguiente:
Obtener los autores de un libro y viceversa (los libros de un autor)
Desasociar un libro de un autor y viceversa
Acá estamos asumiendo que esos dos registros están asociados, aunque si no lo están no ocurre ningún error, simplemente no cambia nada en la base de datos.
Comentarios para los libros
Vamos a implementar la posibilidad de que los usuarios puedan dejar comentarios en los libros. Para eso necesitamos un modelo Comment
que está asociado a un usuario y a un libro. Ejecuta el siguiente comando en la consola:
Ahora corre las migraciones ejecutando:
Abre app/models/book.rb
y agrega la siguiente línea antes del último end
:
Haz lo mismo en app/models/user.rb
.
Crea ahora el controlador de los comentarios ejecutando el siguiente comando:
Abre app/controllers/comments_controllers.rb
y transcribe lo siguiente dentro de la clase:
Lo que está haciendo el código dentro de create
es obteniendo el libro al cuál le estamos dejando el comentario, construyendo el libro y asignándole el usuario que lo creó (el usuario actual).
Agreguemos ahora la ruta al archivo config/routes.rb
:
Por último vamos a modificar las vistas para integrar los comentarios. Crea un archivo llamado _comments.html.erb
en la carpeta app/views/books/
con el siguiente contenido:
Ahora abre app/views/books/show.html.erb
y referencia el partial que acabamos de crear exactamente debajo del siguiente código:
La linea que debes agregar es:
Lo último que nos falta es agregar algunos estilos en app/assets/stylesheets/books.scss
, debajo de la siguiente línea:
Los estilos que vas a agregar son los siguientes:
Prúebalo y vuélvelo a desplegar a Heroku. Asegúrate de estudiar muy bien este código y entender qué está pasando.
Last updated