J'ai un modèle Utilisateurs qui a besoin d'une :email
colonne (j'ai oublié d'ajouter cette colonne lors de l'échafaudage initial).
J'ai ouvert le fichier de migration et ajouté t.string :email
, fait rake db:migrate
et obtenu un fichier NoMethodError
. J'ai ensuite ajouté la ligne
add_column :users, :email, :string
encore rake db:migrate
, encore NoMethodError
. Suis-je en train de manquer une étape ici?
Edit: voici le fichier de migration.
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
la source
add_email_to_users
et NONadd_email_to_user
?rails db:migrate
pour la dernière étape.t.string :column_x, limit: 10, after: :column_y
(pour Rails 4 au moins)Utilisez cette commande sur la console des rails
et
pour exécuter cette migration
la source
Produit parfois
rails generate migration add_email_to_users email:string
une migration comme celle-ciDans ce cas, vous devez manuellement un
add_column
pourchange
:Et puis exécutez
rake db:migrate
la source
rails generate migration add_email_to_users email:string
il être exécuté aprèsbundle exec rails c
ou juste à l'intérieur du terminal? 2) Où est placé le fichier généré une fois que nous avons exécuté la requête?Vous pouvez aussi faire
si vous n'avez ajouté aucune donnée aux tables. Modifiez ensuite le fichier de migration en y ajoutant la colonne e-mail, puis appelez
Cela fonctionnera si vous avez installé des rails 3.1 dans votre système.
Une manière beaucoup plus simple de le faire est de changer le changement de fichier de migration tel quel. utilisation
Cela annulera la dernière migration et la migrera à nouveau.
la source
Pour ajouter une colonne, je devais simplement suivre ces étapes:
rails generate migration add_fieldname_to_tablename fieldname:string
Alternative
rails generate migration addFieldnameToTablename
Une fois la migration générée, modifiez la migration et définissez tous les attributs que vous souhaitez ajouter à cette colonne.
Remarque : Les noms de table dans Rails sont toujours pluriels (pour correspondre aux conventions DB). Exemple utilisant l'une des étapes mentionnées précédemment-
rails generate migration addEmailToUsers
rake db:migrate
Ou
db/schema.rb
, ajoutez les colonnes de votre choix dans la requête SQL.Exécutez cette commande:
rake db:schema:load
Avertissement / Remarque
Gardez à l'esprit que l'exécution
rake db:schema:load
efface automatiquement toutes les données de vos tables.la source
Lorsque j'ai fait cela, plutôt que de tripoter la migration d'origine, j'en crée une nouvelle avec juste la colonne d'ajout dans la section vers le haut et une colonne de suppression dans la section vers le bas.
Vous pouvez changer l'original et le réexécuter si vous migrez entre les deux, mais dans ce cas, je pense que cela a fait une migration qui ne fonctionnera pas correctement.
Tel que publié actuellement, vous ajoutez la colonne, puis créez le tableau.
Si vous changez l'ordre, cela pourrait fonctionner. Ou, lorsque vous modifiez une migration existante, ajoutez-la simplement à la table de création au lieu de faire une colonne d'ajout distincte.
la source
Vous pouvez également forcer à placer des colonnes dans la table à l'aide de
force: true
, si votre table existe déjà.exemple :
la source
Vous pouvez également utiliser la méthode spéciale change_table dans la migration pour ajouter de nouvelles colonnes:
la source
Vous pouvez annuler la dernière migration en
ou annuler cette migration spécifique par
et modifiez le fichier, puis réexécutez
rake db:mirgate
.la source
Vous pouvez également le faire .. migration des rails g add_column_to_users email: string
puis râteau db: migrate ajouter également: attribut email dans votre contrôleur d'utilisateur;
pour plus de détails, consultez http://guides.rubyonrails.org/active_record_migrations.html
la source
Vous pouvez également ajouter une colonne à une position spécifique en utilisant avant la colonne ou après la colonne comme:
Le fichier de migration générera le code suivant sauf après:: email. vous devez ajouter après:: email ou avant:: email
la source