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:
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
rake db:migrate
O
- Puede cambiar el esquema desde
db/schema.rb
, agregue las columnas que desee en la consulta SQL. 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
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 su controlador de usuario;
Para más detalles, visite http://guides.rubyonrails.org/active_record_migrations.html
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