Agregar una columna a una tabla existente en una migración de Rails

Resuelto John asked hace 13 años • 11 respuestas

Tengo un modelo de Usuarios que necesita una :emailcolumna (olvidé agregar esa columna durante la estructura inicial).

Abrí el archivo de migración y agregué t.string :email, lo hice rake db:migratey obtuve un archivo NoMethodError. Luego agregué la línea

add_column :users, :email, :string

otra vez rake db:migrateotra vez NoMethodError. ¿Me estoy perdiendo un paso aquí?

Aquí está el archivo de migración.

class CreateUsers < ActiveRecord::Migration  
  def self.up  
    add_column :users, :email, :string  
    create_table :users do |t|  
      t.string :username  
      t.string :email  
      t.string :crypted_password  
      t.string :password_salt  
      t.string :persistence_token  

      t.timestamps  
    end  
  end  

  def self.down  
    drop_table :users  
  end  
end
John avatar Jan 29 '11 09:01 John
Aceptado

Si ya ejecutó su migración original (antes de editarla), entonces necesita generar una nueva migración ( rails generate migration add_email_to_users email:stringfuncionará). Creará un archivo de migración que contiene la línea: add_column :users, email, string Luego haga a rake db:migratey ejecutará la nueva migración, creando la nueva columna.

Si aún no ha ejecutado la migración original, puede editarla, como está intentando hacerlo. Su código de migración es casi perfecto: solo necesita eliminar la add_columnlínea por completo (ese código intenta agregar una columna a una tabla, antes de que se haya creado la tabla, y el código de creación de su tabla ya se ha actualizado para incluir un de t.string :emailtodos modos).

Dylan Markow avatar Jan 29 '2011 03:01 Dylan Markow

Utilice este comando en la terminal:

rails generate migration add_fieldname_to_tablename fieldname:string

y

rake db:migrate

para ejecutar esta migración

vinodh avatar Apr 15 '2014 10:04 vinodh

A veces rails generate migration add_email_to_users email:stringse produce una migración como esta.

class AddEmailToUsers < ActiveRecord::Migration[5.0]
  def change
  end
end

En ese caso, debe ingresar manualmente add_columna change:

class AddEmailToUsers < ActiveRecord::Migration[5.0]
  def change
    add_column :users, :email, :string
  end
end

y luego correrrake db:migrate

Apurv Agarwal avatar Feb 03 '2018 07:02 Apurv Agarwal

También puedes hacer

rake db:rollback

si no ha agregado ningún dato a las tablas, luego edite el archivo de migración agregando la columna de correo electrónico y luego llame

rake db:migrate

Esto funcionará si tiene Rails 3.1 en adelante instalados en su sistema.

Una forma mucho más sencilla de hacerlo es dejar que el cambio en el archivo de migración sea como está. usar

$rake db:migrate:redo

Esto revertirá la última migración y la migrará nuevamente.

Ninz avatar Oct 17 '2013 06:10 Ninz