sábado, 25 de octubre de 2008

Que son y como hacerlas

Las migrations son archivos escritos en codigo ruby que nos definen nuestro esquema de base de datos cada una es una parte de la base, en las migrations puede haber tanto codigo para crear tablas o modificarlas, como ingreso de datos o cualquier otra cosa que necesitemos en nuestro esquema como por ejemplo un indice. Se debe tratar de que cada migration sea atómica es decir hay que tratar de no modificar o crear mas de una tabla por migration, esto se hace por el hecho de que si falla una parte de una migration hay que volverla para atras y si escribimos por ejemplo la creación de dos tablas, y tenemos un error en la segunda, la primera tabla ya se creo pero falló la migration por lo cual cuando tratemos de correr nuevamente la migration, está nos va a dar un error ya que la primera tabla ya existe, entonces debemos ir a la base de datos y borrarla lo cual no es muy comodo.

En cada migration de definen dos metodos principales el self.up y el self.down, la idea es que en el self.up escribas el codigo necesario para la creación de una tabla el modificiado o lo que sea que desees hacer en esa migration y en el self.down escribas el codigo necesario para revertir ese cambio, a continuacion voy a poner una lista con las operaciones que se pueden realizar en las migrations:

Table Options (table 1.1):
  • string (crea una campo del tipo string)
  • boolean (crea un campo del tipo boolean)
  • integer (crea un campo del tipo integer)
  • float (crea un campo del tipo float)
  • date (crea un campo del tipo date)
  • datetime (crea un campo del tipo datetime)
  • remove (quita un campo de la tabla, se utiliza solo para el change_table)
  • references (crea un campo utilizando el nombre del campo + "_id")
  • remove_references (quita un campo que tiene el nombre del campo + "_id")
  • change (cambia un campo, solo se utiliza para el change_table)
  • change_default (cambia el valor por defecto de un campo)
  • index (crea un indice para un atributo de la tabla)
  • remove_index (quita un indice a determinado atributo)
  • timestamp (crea dos campos un es created_at y otro updated_at)
  • remove_timestamps (quita dos campos created_at y updated_at, solo se utilza en el change_table)
  • rename (cambia el nombre del atributo)

create_table

create_table nombre_de_tabla opciones_de_creacion do |table|
   table.options nombre_del_campo, aditional_options
end

En options puede ir cualquiera de las opciones que esta dentro de table 1.1

En opciones_de_creacion puede ir cualquiera de las siguientes opciones

  • id - Por defecto esta true, si esta en true crea un atributo con el nombre id y el tipo integer
  • primary_key - Por defecto toma como primary_key al id, pero se le puede indicar cualquier campo de 
  • force - Por defecto esta en false, si esta en true nos indica que se cree la tabla aunque exista, en false indica lo contrario
Nota: 

 - Por defecto crea la primary key como id se pude cambiar utilizando las opciones.

Ejemplos 

create_table :users do |table|
   table.string :nombre
   table.date :fecha_nacimiento
   table.boolean :activo
end

Crea una tabla llamada users con los siguientes campos id como primary key, nombre del tipo string, fecha_nacimiento del tipo date, y activo del tipo boolean.

create_table :users, :id => false, :force => true do |table|
   table.string :nombre
   table.date :fecha_nacimiento
end

Crea una tabla llamada users (aunque ya exista) con los siguientes campos nombre del tipo string y fecha_nacimiento del tipo date.

create_table :users, :id => false, :force => true do |table|
   table.string :nombre
   table.date :fecha_nacimiento
   table.references :event
end

Crea una tabla llamada users (aunque ya exista) con los siguientes campos nombre del tipo string, fecha_nacimiento del tipo date y event_id del tipo integer.

change_table

change_table nombre_de_tabla opciones_de_creacion do |table|
   table.options nombre_del_campo, aditional_options
end

El change_table es basicamente igual que el create_table en cuanto a sus opciones (ver la tabla 1.1), pero su accion es cambiar una tabla, esta debe existir.

Ejemplos

change_table :users do |table|
   table.string :nombre, :default => "pepe"
   table.remove :fecha_nacimiento
end

Este ejemplo agrega a la tabla users un campo nombre del tipo string que su valor por defecto es "pepe" y quita de la tabla el campo fecha de nacimiento (el mismo debe existir en la tabla).

change_table :users do |table|
   table.index :type
   table.remove_references :event
end

Este ejemplo crea un indice para el atributo type y quita el campo event_id.

change_table :users do |table|
   table.change_default :nombre, "raul"
   table.change :edad, :integer, :default => 0
   table.timestamp
end

Este ejemplo cambia el tipo por defecto del campo nombre por "raul", cambia el tipo de edad para integer y le asigna el valor por defecto 0, y crea dos campos created_at y updated_at que indican cuando fue creado el usuario y cuando se modifico

drop_table

drop_table nombre_de_tabla

Esta sentencia nos permite eliminar una tabla

Ejemplo

drop_table :users


No hay comentarios: