Agregar una columna a una tabla existente en una migración de Rails
Tengo un modelo de Usuarios que necesita una :email
columna (olvidé agregar esa columna durante la estructura inicial).
Abrí el archivo de migración y agregué t.string :email
, lo hice rake db:migrate
y obtuve un archivo NoMethodError
. Luego agregué la línea
add_column :users, :email, :string
otra vez rake db:migrate
otra 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
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:string
funcionará). Creará un archivo de migración que contiene la línea:
add_column :users, email, string
Luego haga a rake db:migrate
y 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_column
lí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 :email
todos modos).
Utilice este comando en la terminal:
rails generate migration add_fieldname_to_tablename fieldname:string
y
rake db:migrate
para ejecutar esta migración
A veces rails generate migration add_email_to_users email:string
se produce una migración como esta.
class AddEmailToUsers < ActiveRecord::Migration[5.0]
def change
end
end
En ese caso, debe ingresar manualmente add_column
a change
:
class AddEmailToUsers < ActiveRecord::Migration[5.0]
def change
add_column :users, :email, :string
end
end
y luego correrrake db:migrate
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.