Cómo soltar columnas usando la migración de Rails


Respuestas:


917
remove_column :table_name, :column_name

Por ejemplo:

remove_column :users, :hobby

eliminaría la columna de hobby de la tabla de usuarios.


99
Y asegúrese de hacer esto dentro upy los downmétodos, no change, como se explica en la respuesta de @Powers.
XåpplI'-I0llwlg'I -

77
@ XåpplI'-I0llwlg'I-Gracias por el comentario. El método de cambio se puede usar para colocar una columna en las aplicaciones de Rails 4, pero no se debe usar en Rails 3. Actualicé mi respuesta en consecuencia.
Powers

99
También puede usarlo remove_column :table_name, :column_name, :type, :optionsdentro del changemétodo, ya que si especifica el tipo, es posible revertir la migración. A partir de la documentación: La typey optionsparámetros serán ignorados si está presente. Puede ser útil proporcionarlos en el changemétodo de una migración para que pueda revertirse. En ese caso, typey optionsserá utilizado por add_column.
Nicolas

24
En Rails4, puede eliminar una columna en el changemétodo, pero solo si especifica el tipo de columna. Por ej remove_column, :table_name, :column_name, :column_type. De lo contrario, recibirá el siguiente error cuando intente ejecutar la migración:remove_column is only reversible if given a type
Dennis

55
Vale la pena señalar en la respuesta principal que eliminar una columna no elimina el índice correspondiente si existe
sameers

371

Para versiones anteriores de Rails

ruby script/generate migration RemoveFieldNameFromTableName field_name:datatype

Para rieles 3 y superiores

rails generate migration RemoveFieldNameFromTableName field_name:datatype

18
"rails g" se puede usar como una alternativa a "rails generate"
Noz

44
rails g migration remove_field_name_from_table_name field_name:datatypetambién funciona
Stuart Nelson

66
Tenga en cuenta también que AddXXXtoTTTuna RemoveXXXFromTTTpuede ser seguido por una lista blanca espaciada de filed_name: data_type, y se crearán los estados add_column y remove_column apropiadas: rails g migration RemoveUnusefulFieldsFromUsers hair_color:string favorite_number:integerelimina dos atributos utilizando una sola migración. Tenga en cuenta también que remove_columnno es compatible con el changemétodo, por lo que debe escribir ambos upy down.
Claudio Floreani

3
Rails 4 parece apoyar changeesto. Rollback funciona como debería.
Unknown_Guy

2
@AdamGrant Creo que si está utilizando un changemétodo que se puede revertir * deberá informar el tipo de datos (y todos los demás modificadores de campo), por lo que si revierte esa migración, el campo se puede recrear correctamente. * Cuando digo revertido, eso es en términos de estructura de la base de datos, por supuesto, los datos de esa columna obviamente se perderán.
RFVoltolini

117

Rails 4 se ha actualizado, por lo que el método de cambio se puede usar en la migración para descartar una columna y la migración se revertirá con éxito. Lea la siguiente advertencia para las aplicaciones de Rails 3:

Rieles 3 Advertencia

Tenga en cuenta que cuando utiliza este comando:

rails generate migration RemoveFieldNameFromTableName field_name:datatype

La migración generada se verá así:

  def up
    remove_column :table_name, :field_name
  end

  def down
    add_column :table_name, :field_name, :datatype
  end

Asegúrese de no utilizar el método de cambio al eliminar columnas de una tabla de base de datos (ejemplo de lo que no desea en el archivo de migración en las aplicaciones Rails 3):

  def change
    remove_column :table_name, :field_name
  end

El método de cambio en Rails 3 no es inteligente cuando se trata de remove_column, por lo que no podrá revertir esta migración.


3
luego ejecute rake db:
migrate

1
@Powers, una respuesta brillante y clara, ¿podría explicar lo siguiente: "El método de cambio en Rails 3 no es inteligente cuando se trata de eliminar_columna, por lo que no podrá revertir esta migración".
BKSpurgeon

1
@BKSpurgeon: en Rails 3, si usa el changemétodo, el rake db:rollbackcomando generará un error. rake db:rollbackes básicamente lo contrario de rake db:migrate. Este error se corrigió en Rails 4 :)
Powers

2
En Rails 4, intenté deshacer una columna de cambio de caída. Falla y establece que debe especificar data_type (como en su código inactivo en su respuesta)
rmcsharry

1
Se me ocurrió el mismo problema que a @rmcsharry. Mi versión de rails es 4.2.2 y utilicé el método de cambio. cuando intenté revertir, ocurrió un error que remove_column solo es reversible si se le da un tipo.
M. Habib

38

En una aplicación rails4 es posible usar el método de cambio también para eliminar columnas. El tercer parámetro es data_type y en el opcional puede dar opciones. Está un poco oculto en la sección 'Transformaciones disponibles' en la documentación .

class RemoveFieldFromTableName < ActiveRecord::Migration
  def change
    remove_column :table_name, :field_name, :data_type, {}
  end
end

27

Hay dos buenas formas de hacer esto:

remove_column

Simplemente puede usar remove_column, así:

remove_column :users, :first_name

Esto está bien si solo necesita hacer un solo cambio en su esquema.

bloque change_table

También puede hacer esto usando un bloque change_table, así:

change_table :users do |t|
  t.remove :first_name
end

Prefiero esto ya que lo encuentro más legible, y puedes hacer varios cambios a la vez.

Aquí está la lista completa de métodos de change_table compatibles:

http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/change_table


15

en rails 5 puedes usar este comando en la terminal:

rails generate migration remove_COLUMNNAME_from_TABLENAME COLUMNNAME:DATATYPE

por ejemplo, para eliminar la columna access_level (string) de los usuarios de la tabla:

rails generate migration remove_access_level_from_users access_level:string

y luego ejecuta:

rake db:migrate

14

Genere una migración para eliminar una columna de modo que si se migra ( rake db:migrate), se debe soltar la columna . Y debería agregar una columna de nuevo si esta migración se revierte ( rake db:rollback).

La sintaxis:

remove_column: table_name,: column_name,: type

Elimina la columna, también agrega la columna si la migración se revierte.

Ejemplo:

remove_column :users, :last_name, :string

Nota : Si omite el tipo de datos , la migración eliminará la columna con éxito, pero si revierte la migración arrojará un error.


13

Instrucciones claras y simples para rieles 5.2

  • ADVERTENCIA: perderá datos si elimina una columna de su base de datos . Para continuar, vea a continuación:
  • Advertencia: las siguientes instrucciones son para migraciones triviales . Para migraciones complejas con, por ejemplo, millones y millones de filas, deberá tener en cuenta la posibilidad de fallas, también tendrá que pensar en cómo optimizar sus migraciones para que se ejecuten rápidamente y la posibilidad de que los usuarios usen su aplicación mientras El proceso de migración está ocurriendo. Si tiene varias bases de datos, o si algo es remotamente complicado, ¡no me culpe si algo sale mal!

1. Crear una migración

Ejecute el siguiente comando en su terminal:

rails generate migration remove_fieldname_from_tablename fieldname:fieldtype

Nota: el nombre de la tabla debe estar en forma plural según la convención de rails.

Ejemplo:

En mi caso, quiero eliminar la acceptedcolumna (un valor booleano) de la quotestabla:

rails g migration RemoveAcceptedFromQuotes accepted:boolean

Consulte la documentación sobre: ​​una convención al agregar / eliminar campos a una tabla:

Hay un acceso directo sintáctico especial para generar migraciones que agregan campos a una tabla.

los rieles generan migración add_fieldname_to_tablename fieldname: fieldtype

2. Comprueba la migración

# db/migrate/20190122035000_remove_accepted_from_quotes.rb
class RemoveAcceptedFromQuotes < ActiveRecord::Migration[5.2]
  # with rails 5.2 you don't need to add a separate "up" and "down" method.
  def change
    remove_column :quotes, :accepted, :boolean
  end
end

3. Ejecute la migración

rake db:migrate

.... Y luego te vas a las carreras!


ahora las migraciones también se pueden ejecutar comorails db:migrate
Imran Ali

12

Eliminar la aplicación Columns For RAILS 5

rails g migration Remove<Anything>From<TableName> [columnName:type]

El comando anterior genera un archivo de migración dentro del db/migratedirectorio. Snippet Blow es uno de los ejemplos de eliminación de columnas de la tabla generados por el generador Rails,

class RemoveAgeFromUsers < ActiveRecord::Migration
  def up
    remove_column :users, :age
  end
  def down
    add_column :users, :age, :integer
  end
end

También hice una guía de referencia rápida para Rails que se puede encontrar aquí .



10
rails g migration RemoveXColumnFromY column_name:data_type

X = nombre de columna
Y = nombre de la tabla

EDITAR

Cambiado RemoveXColumnToYa RemoveXColumnFromYsegún los comentarios, proporciona más claridad sobre lo que realmente está haciendo la migración.


3
"Quitar la columna a la tabla" suena extraño, por lo que a partir parece ser la mejor opción aquí.
Sebastian vom Meer

@SebastianvomMeer sí, estoy de acuerdo: el inglés se lee mucho mejor con 'from'
BKSpurgeon el

8

Para eliminar la columna de la tabla, debe ejecutar la siguiente migración:

rails g migration remove_column_name_from_table_name column_name:data_type

Luego ejecute el comando:

rake db:migrate

5

Dé el comando a continuación, agregará el archivo de migración por sí solo

rails g migration RemoveColumnFromModel

Después de ejecutar el comando anterior, puede comprobar que el archivo de migración remove_column code debe agregarse allí por sí solo

Luego migra el db

rake db:migrate


5

Para eliminar la columna de la tabla en 3 sencillos pasos de la siguiente manera:

  1. escribe este comando

rails g migration remove_column_from_table_name

después de ejecutar este comando en la terminal un archivo creado con este nombre y marca de tiempo (remove_column from_table_name).

Luego ve a este archivo.

  1. dentro del archivo tienes que escribir

    remove_column :table_name, :column_name

  2. Finalmente ve a la consola y luego haz

    rake db:migrate


2

Aquí hay uno más de la consola de rieles

ActiveRecord::Migration.remove_column(:table_name, :column_name)


1

A través
remove_column :table_name, :column_name
de un archivo de migración

Puede eliminar una columna directamente en una consola de rieles escribiendo:
ActiveRecord::Base.remove_column :table_name, :column_name


1

Hazlo así;

rails g migration RemoveColumnNameFromTables column_name:type

Es decir rails g migration RemoveTitleFromPosts title:string

De todos modos, sería mejor considerar también el tiempo de inactividad, ya que ActiveRecord almacena en caché las columnas de la base de datos en tiempo de ejecución, por lo que si suelta una columna, podría causar excepciones hasta que la aplicación se reinicie.

Ref: migración fuerte


1

Simplemente, puedes eliminar la columna

remove_column :table_name, :column_name

Por ejemplo,

remove_column :posts, :comment

1

Primero intente crear un archivo de migración ejecutando el comando:

rails g migration RemoveAgeFromUsers age:string

y luego en el directorio raíz del proyecto ejecute la migración ejecutando el comando:

rails db:migrate
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.