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


Tengo un modelo Users que necesita una columna :email (olvidé agregar esa columna durante el scaffold inicial).

Abrí el archivo de migración y agregué t.string :email, hice rake db:migrate, y obtuve un 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í?

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
Author: Andrew Hendrie, 2011-01-29

9 answers

Si ya ha ejecutado su migración original (antes de editarla), entonces necesita generar una nueva migración (rails generate migration add_email_to_users email:string hará el truco). Luego haga un rake db:migrate y ejecutará la nueva migración.

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

 473
Author: Dylan Markow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-17 12:30:56

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

Y

rake db:migrate para ejecutar esta migración

 87
Author: vinodh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-15 13:24:30

También puedes hacer

rake db:rollback

Si no ha agregado ningún dato a las tablas.Luego edite el archivo de migración agregándole la columna de correo electrónico y luego llame a

rake db:migrate

Esto funcionará si tiene rails 3.1 en adelante instalado en su sistema.

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

$rake db:migrate:redo.

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

 21
Author: Ninz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-19 11:17:13

A veces 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 usted tiene que manualmente una línea adicional a change

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

Y luego ejecutar rake db:migrate

 18
Author: Apoorv Agarwal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-03 07:36:24

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 generada la migración, edite la migración y defina todos los atributos que desea que tenga esa columna agregada.

    Nota : Los nombres de las tablas en Rails son siempre plurales (para coincidir con las convenciones de la BD). Ejemplo usando 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, ejecutando rake db:schema:load automáticamente borra todos los datos en sus tablas.

 17
Author: Pratik Naik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-09 22:33:43

Cuando he hecho esto, en lugar de juguetear con la migración original, creo una nueva con solo la columna agregar en la sección arriba y una columna soltar en la sección abajo.

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

Como está publicado actualmente, está agregando la columna y luego creando la tabla.

Si cambia el orden, podría funcionar. O, como usted está modificando un migración existente, simplemente agréguela a la tabla create en lugar de hacer una columna add separada.

 3
Author: Don Roby,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-29 03:21:35

También puede forzar a las columnas de la tabla en la tabla usando force: true, si la 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
 1
Author: Aravin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-11 18:12:43

Podría revertir la última migración por

rake db:rollback STEP=1

O revertir esta migración específica por

rake db:migrate:down VERSION=<YYYYMMDDHHMMSS>

Y edite el archivo, luego ejecute rake db:mirgate de nuevo.

 0
Author: fangxing,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-20 15:22:19

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

Entonces rake db: migrate también agregue: atributo de correo electrónico en su controlador de usuario;

Para más detalles echa un vistazo a http://guides.rubyonrails.org/active_record_migrations.html

 0
Author: aaquib,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-04 07:44:09