Migraciones - moiseserg/rubyWebDev GitHub Wiki

Las migraciones son el mapeo de los modelos a la estructura de una tabla en una base de datos. Por default durante la etapa de desarrollo se usa comúnmente SQLite como gestor de bases de datos. Esto está configurado en el archivo Gemfile.

El archivo para generar las migraciones para la tabla Empleados se guardan en la carpeta db, por cada modelo que se genere o algún cambio que se desee (agregar campos, quitarlos, renombrarlos, etc.) se guardarán como migraciones en esta carpeta. En versiones anteriores de rails se usaba un número de versión para los nombres de los archivos, actualmente se usa una estampa de tiempo y lo que se realizó en la migración, en este caso la creación de la tabla Empleados.

$ tree db
db
├── migrate
│   └── 20180123181704_create_empleados.rb
├── schema.rb
└── seeds.rb

1 directory, 3 files

La migración contiene la información que se introdujo usando scaffold

$ more db/migrate/20180123181704_create_empleados.rb 
class CreateEmpleados < ActiveRecord::Migration[5.1]
  def change
    create_table :empleados do |t|
      t.string :nombre
      t.text :direccion
      t.integer :edad
      t.timestamps
    end
  end
end

Al ejecutar el scaffold no se crean los modelos en la base de datos, para comprobarlo se puede meter a la consola de rails usando el comando rails console (o rails c, abreviado). En este caso si se desea acceder a los datos del modelo Empleado, se genera un error, ya que la base de datos no ha sido creada.

$ rails c 
2.0.0-p247 :001 > Empleado.all 
  Empleado Load (0.4ms)  SELECT "empleados".* FROM "empleados" 
SQLite::SQLException: no such table: empleados: SELECT "empleados".* FROM "empleados"

Para completar la creación de la tabla, es necesario usar el comando rake (Ruby make) que completa la migración del modelo a la tabla empleados.

$ rake db:migrate 
==  CreateEmpleados: migrating ================================================ 
-- create_table(:empleados) 
   -> 0.0027s 
==  CreateEmpleados: migrated (0.0029s) ======================================= 

Esta opción genera la tabla empleados, en este momento se podrá ejecutar la orden anterior para listar los empleados en la tabla, sin embargo hasta el momento no hay empleados.

 >   Empleado.all 
  Empleado Load (1.9ms)  SELECT "empleados".* FROM "empleados" 
 => #<ActiveRecord::Relation []> 

Se pueden insertar empleados a la tabla ya sea por línea de comandos o usando la interfaz Web (que es el objetivo de la aplicación), en este caso se accesa al servidor a la dirección: http://localhost/empleados, (figura 10) la cuál mostrará una lista vacía de empleados. Si se selecciona New Empleado se cargará la página de la siguiente URL http://localhost:3000/empleados/new (figura 11) - actividad realizada por el controlador que conoce donde están los archivos que deben cargarse para cada acción.

Después de crear el registro de un empleado al hacer clic en Create Empleado, a

nuevo empleado

parece una página informando sobre la creación exitosa del registro del empleado en la tabla (opción notice en el controlador). Esto lo hace generando la URL http://localhost:3000/empleados/1 que invoca al método Show generado de forma automática por el scaffold. Se puede usar esta URL cada vez que se quiera mostrar a dicho empleado.

Archivo show.html.erb:

<p id="notice"><%= notice %></p>


<table class="table table-striped">
	<tr>
	  <td><strong>Nombre:</strong></td>
	  <td><%= @empleado.nombre %></td>
	</tr>

	<tr>
	  <td><strong>Direccion:</strong></td>
	  <td><%= @empleado.direccion %></td>
	</tr>

	<tr>
	  <td><strong>Edad:</strong></td>
	  <td><%= @empleado.edad %></td>
	</tr>	
</table>

<%= link_to 'Modificar', edit_empleado_path(@empleado) %> |
<%= link_to 'Regresar', empleados_path , :class =>"btn btn-secondary text-light" %>

Archivo empleados_controller.rb:

class EmpleadosController < ApplicationController
  ...

  # GET /empleados/new
  def new
    @empleado = Empleado.new
  end

  ...

  def create
    @empleado = Empleado.new(empleado_params)

    respond_to do |format|
      if @empleado.save
        format.html { redirect_to @empleado, notice: 'Empleado was successfully created.' }
        format.json { render :show, status: :created, location: @empleado }
      else
        format.html { render :new }
        format.json { render json: @empleado.errors, status: :unprocessable_entity }
      end
    end
  end

  ...

nuevo empleado

La URL http://localhost:3000/empleados/id donde id es el identificador generado de forma automática para el modelo puede ser usada para mostrar cualquier elemento existente en la tabla.

⚠️ **GitHub.com Fallback** ⚠️