Migración de Llave Foránea: Enlazar Tarea con Usuario en Rails

Clase 24 de 36Curso de Introducción a Ruby on Rails

Resumen

¿Cómo realizar una migración manual en Rails para enlazar llaves foráneas?

La capacidad de realizar migraciones manuales en Rails es sumamente útil para cualquier desarrollador que busque mantener sus modelos actualizados y eficientes. A través de comandos especializados, puedes modificar la estructura de tu base de datos conforme tus proyectos evolucionan. En esta ocasión, exploraremos cómo enlazar la llave foránea de una tarea con la asignación de un usuario en Rails.

¿Cómo configurar la migración inicial?

Para comenzar la migración, primero accede a tu consola de comandos y ejecuta el comando rails generate migration. Este comando es esencial porque te permite actualizar y modificar la estructura de tu base de datos conforme tus requerimientos cambian. En el caso de una tarea, lo que buscamos es añadir un propietario, que será el usuario encargado de dicha tarea.

rails generate migration AddOwnerToTask user:references

Este comando generará una nueva migración en la carpeta db/migrate. Accede a este archivo con tu editor de texto favorito para realizar las modificaciones necesarias.

¿Cómo definir la relación en el modelo?

Una vez en el archivo de migración, queremos asegurarnos de que la tarea incluya una referencia de usuario, que ahora denominaremos "propietario" para mayor claridad en la relación. Cambiamos el término user por owner y aseguramos que la relación no pueda ser nula y sea foránea.

Además, es importante indicarle a Rails que a pesar de llamar a la relación Owner, la tabla que debe buscar es la de Users.

class AddOwnerToTask < ActiveRecord::Migration[6.0]
  def change
    add_reference :tasks, :owner, null: false, foreign_key: { to_table: :users }, index: true
  end
end

¿Cómo ajustar los modelos?

Para complementar el proceso, debemos modificar el modelo de la tarea para reflejar esta nueva relación. Navega a app/models/task.rb y añade la asociación belongs_to :owner, especificando que el Owner es realmente un Usuario.

class Task < ApplicationRecord
  belongs_to :category
  belongs_to :owner, class_name: 'User'
end

En el modelo de usuario (si se desea), se puede añadir la contraparte de la relación con has_many :tasks.

class User < ApplicationRecord
  has_many :tasks, foreign_key: :owner_id
end

¿Cómo ejecutar la migración y solucionar posibles errores?

Finalizadas las modificaciones en código, regresa a la consola y ejecuta el comando rails db:migrate. Sin embargo, si encuentras un error relacionado con registros existentes que no cumplen con la validación del owner_id, puedes resolverlo con el comando rails db:reset.

rails db:migrate

Si el error persiste, detén cualquier servidor o proceso que esté en ejecución y usa:

rails db:reset

Este comando restablecerá tu base de datos a la versión inicial, permitiendo que todas las migraciones se ejecuten desde el principio, incluyendo las nuevas.

¿Qué recomendaciones tener en mente?

  • Siempre realiza copias de seguridad de tu base de datos antes de proceder con cambios significativos.
  • Asegúrate de detener cualquier servidor que pueda interferir con los comandos de migración.
  • Documenta tus migraciones para que tú y otros desarrolladores puedan entender fácilmente los cambios realizados.

¡Anímate a seguir explorando y experimentando con Rails! Cada paso que tomas te acerca más a ser un experto en el desarrollo ágil y eficiente.