regresar rails migraciones migracion llaves hacer foraneas eliminar deshacer crear comando columna ruby-on-rails-3

ruby on rails 3 - migraciones - Agregar una columna a una tabla existente en una migración de Rails



migraciones rails (9)

Tengo un modelo de Usuarios que necesita una columna de :email (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 , otra vez NoMethodError . ¿Me estoy perdiendo un paso aquí?

Edición: 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


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 tienes que change manualmente una línea extra.

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

Y luego ejecuta rake db:migrate


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

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

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

Si cambias el orden podría funcionar. O, mientras está modificando una migración existente, simplemente agréguela a la tabla de creación en lugar de hacer una columna de adición separada.


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 genere 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 los carriles son siempre plurales (para coincidir con las convenciones de la base de datos). 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 , agregue las columnas que desee en la consulta SQL.
  2. Ejecute este comando: rake db:schema:load

    Advertencia / Nota

    Tenga en cuenta que al ejecutar rake db:schema:load se borran automáticamente todos los datos de sus tablas.


Podrías 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 nuevamente.


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 haga un rake db:migrate y ejecutará la nueva migración.

Si aún no ha ejecutado la migración original, solo puede editarla, como 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).


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



Tambien 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 rieles 3.1 en adelante instalados en su sistema.

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

$rake db:migrate:redo

Esto hará retroceder la última migración y migrarla de nuevo.


Usa este comando en la consola de rieles.

rails generate migration add_fieldname_to_tablename fieldname:string

y

rake db:migrate

para ejecutar esta migración