Haciendo un rake db:rollback deshacemos los últimos cambios generados en la base de datos, pero no es lo más correcto solo modificar el schema o migración existente para después hacer un rake db:migrate (aunque el proceso puede ser válido siempre y cuando se esté trabajando unicamente en entorno de desarollo). El proceso correcto sería creando una nueva migración y que esta sea la encargada de hacer las modificaciones necesarias.
**Algunos comandos de ayuda en la consola de rails (rails console)
1.- Consultar las tablas que hay en nuestra aplicación:
ActiveRecord::Base.connection.tables
2.- Consultar las columnas de nuestra tabla de una manera ordenada (usando el .map{})
ActiveRecord::Base.connection.columns("nombre_tabla").map{|c| [c.name, c.type]}
3.- Borrar una tabla en especifico:
ActiveRecord::Migration.drop_table(:articles)
O a través de una 2da migración como se ve aquí:
MODIFICAR EL LINK DE BORRAR TABLA ARTICLES
Modificar una tabla con una migración
Las migraciones que se vayan creando en el proyecto, se irán nombrando de la siguiente manera: YYYYMMDDHHMMSS_nombre_de_la_migracion.rb que con esto se puede entender que se guardar en un "instante del tiempo" para definir el orden correcto de las migraciones, es decir, que cada una vaya siguiendo su patrón correcto de ejecución para evitar conflictos entre las diferentes versiones de cambios y que estos pudieran tener repercusiones en la tabla destino.Se ejemplifica que se ha creado un scaffold (igual se puede usar en caso de haber creado solo el modelo)que contendría los siguientes campos:
rails generate scaffold Article name description:text pricing:decimal user:references
Caso 1: Añadir nuevos campos a la tabla Articles
1.- Se crea la migración, ejecutando este comando en cosola, donde AddColumnWidthHeightToArticles es el nombre que llevará la migración, este es arbitrario y puede nombrarse al gusto, en este caso, se pretende especificar qué será lo que hará la migraciónrails generate migration AddColumnWidthHeightToArticles
2.- Esto nos genera un archivo de migración en db/migrate y aquí es dónde indicaremos que acción se generará:
![]() |
(Clic para agrandar) |
add_column :articles, :width, :decimal, scale: 2, precision: 5
add_column :articles, :height, :decimal, scale: 2, precision: 5
end
add_column será el método que queremos realizar.
:articles es el primer parametro, el cual indica la tabla a la que realizará la acción.
:witdh será el nombre del campo que añadirá la migración.
:decimal será el tipo de campo.
scale: 2 Como el campo es un decimal, aquí indicaremos que se conformará por 2 digitos después del punto decimal.
precision; 5 indicará el número total que conformará nuestro decimal, en este caso, serán 5, que con el valor anterior se entiende que el número se conformará por 3 números antes del punto y 2 después de él.
De la misma manera que se hizo con scale y precision, se podrán ir indicando qué otras caracteristicas tendrá nuestro campo, como por ejemplo: index: true, foreign_key: true, default: "valor_por_defecto", etc
Ahora que sabemos como funciona la estructura, podemos modifcar un poco el comando ejecutado en el primer punto, cambiando el nombre que se indicó de la migración
rails generate migration AddCommentsToArticles comments:string
Al ejecutarlo de esta manera, le estamos indicando al generador, que el archivo que creará tendrá como contenido un add_column con un campo llamado commets del tipo string:
![]() |
(Clic para agrandar) |
Se pueden añadir la cantidad de campos que se desee, solo es necesario separar con un espacio los campos que se incluirán:
rails generate migration AddDetailsToArticles comments:string witdh:decimal height:decimal3.- En esta, y en todas las migraciones, finalizamos con rake:db migrate para correr las migraciones y procesa al borrado de la tabla
Caso 2: Quitar campos de la tabla Articles
1.- Podemos usar el último comando visto para así poder eliminar una columna sin necesidad de modificar el archivo de migraciónrails generate migration RemoveCommentsFromArticles commens:string
![]() |
(Clic para agrandar) |
Caso 3: Cambiar tipo de campo en la tabla Articles
1.- Para generar cambios al tipo de campo, usaremos change_column usando como ejemplo el campo que se creó anteriormente de comments declarado como un string, ahora lo cambiaremos a un textdef change
change_column :articles, :comments, :text
end
![]() |
(clic para agrandar) |
Caso 4: Renombrar campos en la tabla Articles
1.- Con rename_column se puede cambiar el nombre del campo, en este caso se está cambiando de nombre a comments para que sea ahora opinions:def change
rename_column :articles, :comments, :opinions
end
![]() |
(clic para agrandar) |
Caso 5: Modificando la estructura de la tabla
Al momento de crear un modelo o un scaffold, este genera una migración que contiene el objeto create_table y sobre este se genera la estructura. Por lo tanto, podemos hacer uso de un objeto similar para reestructurar nuestra tabla con parte de lo visto, en este caso, usaremos change_table:def change
change_table :articles do |t|
t.string :color #Añade un campo llamado color de tipo string
t.remove :opinions, :widht, :height #Remueve los campos opinions, width y height
t.rename :name, :title #Renombra el campo name por title
end
end
![]() |
(clic para agrandar) |
Definiciones complementarias para el método Change:
- add_column
- add_index
- add_reference
- add_timestamps
- add_foreign_key
- create_table
- create_join_table
- drop_table
- drop_join_table
- remove_timestamps
- rename_column
- rename_index
- remove_reference
- rename_table
Caso 6: Borrando la tabla con migraciones
Para este caso usaremos los métodos UP y DOWN quienes se encargarán de llevar a cabo el borrado de la tabla. Al usar estos métodos estamos indicando a rails que hacer en la migración y qué hacer al revertir con rollback. Dentro de UP escribiremos las acciones que queremos que lleve a cabo la migración, mientras que en DOWN que será lo que tendría que hacer en caso de hacer un rollback.
En caso de usarse en un caso más complejo de manipulación, se seguirá el mismo principio de ordenamiento de rails, es decir, en DOWN escribiremos el inverso "de abajo a arriba" en el orden que se fueron definiendo dentro de UP.
En el caso de que una migración se vuelva compleja y no se pueda revertir lo ejecutado, por ejemplo, los datos perdidos al borrar un campo/tabla que no pueden volverse a recuperar, entonces dentro de DOWN se puede escribir raise ActiveRecord::IrreversibleMigration y con esto estamos indicando a rails que el rollback no podría ejecutarse, y en caso de hacerlo, arrogaría un error y no ejecutaría el comando.
1.- Se crea la migración:
rails generate migration DropPruebasTable
2.- Esto nos genera un archivo de migración en db/migrate y aquí es dónde indicaremos que acción se generará, en este caso, el borrado de la tabla:
def up
drop_table :pruebas
end
def down
raise ActiveRecord::IrreversibleMigration
end
![]() |
(clic para agrandar) |
**Para tener toda la información completa acerca de las Migraciones:
Fuente
It is nice blog Thank you provide important information and i am searching for same information to save my time Ruby on Rails Online Course
ResponderEliminar