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

Tengo un modelo de usuarios que necesita una columna de :email (se me olvidó agregar esa columna durante el andamio inicial).

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

 add_column :users, :email, :string 

de nuevo rake db:migrate NoMethodError , nuevamente NoMethodError . ¿Me estoy perdiendo un paso aquí?

Editar: 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 ha ejecutado su migración original (antes de editarla), entonces necesita generar una nueva migración (los rails generate migration add_email_to_users email:string hará el truco). Luego haz un rake db:migrate y ejecutará la nueva migración.

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

Utilice este comando en Rails de la consola rails generate migration add_fieldname_to_tablename fieldname:string

y

rake db:migrate para ejecutar esta migración

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 los Rails 3.1 en adelante instalados en su sistema.

Una manera mucho más simple de hacerlo es cambiar, dejar que el cambio en el archivo de migración sea como es. utilizar

$rake db:migrate:redo .

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

Para agregar una columna, solo tenía que seguir estos pasos:

  1. rails generate migration add_fieldname_to_tablename fieldname:string

    Alternativa

    rails generate migration addFieldnameToTablename

    Una vez que se genera la migración, edite la migración y defina todos los atributos que desea que tenga esa columna.

    Nota : Los nombres de tabla en Rails son siempre plurales (para que coincidan con las convenciones de DB). Ejemplo utilizando uno de los pasos mencionados anteriormente-

    rails generate migration addEmailToUsers

  2. rake db:migrate

O

  1. Puede cambiar el esquema desde db/schema.rb , agregar las columnas que desee en la consulta SQL.
  2. Ejecute este comando: rake db:schema:load

    Advertencia / Nota

    Tenga en cuenta que ejecutar rake db:schema:load borra automáticamente todos los datos en sus tablas.

A veces, los rails generate migration add_email_to_users email:string produce una migración como esta

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

En ese caso, tiene que manualmente una línea adicional para change

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

Y luego ejecute rake db:migrate

Cuando hice esto, en lugar de manipular la migración original, creo una nueva con solo agregar la columna en la sección superior y una columna desplegable en la sección inferior.

Puede cambiar el original y volver a ejecutarlo si migra entre ellos, pero en este caso creo que se ha realizado una migración que no funcionará correctamente.

Según se publica actualmente, está agregando la columna y luego creando la tabla.

Si cambias el orden, podría funcionar. O bien, como está modificando una migración existente, simplemente agréguela a la tabla de creación en lugar de hacer una columna de agregar por separado.

También puede forzar a las columnas de la tabla en la tabla usando force: true , si su tabla ya existe.

ejemplo :

 ActiveRecord::Schema.define(version: 20080906171750) do create_table "authors", force: true do |t| t.string "name" t.datetime "created_at" t.datetime "updated_at" end end 

Podría deshacer la última migración por

 rake db:rollback STEP=1 

o revertir esta migración específica por

 rake db:migrate:down VERSION= 

y edite el archivo, luego ejecute rake db:mirgate nuevamente.

También puede hacer esto .. rails g migration add_column_to_users email: string

luego rake db: migrate también agrega: atributo de correo electrónico en tu controlador de usuario;

para obtener más detalles, consulte http://guides.rubyonrails.org/active_record_migrations.html