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
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).
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
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.
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
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 :
-
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
rake db:migrate
O
- Puede cambiar el esquema desde
db/schema.rb
, Agregar las columnas que desee en la consulta SQL. -
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.
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.
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
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.
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
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