Si je crée une nouvelle migration Rails 3 avec (par exemple)
rails g migration tester title:tester user:references
, tout fonctionne bien ... mais si j'ajoute une colonne avec quelque chose du genre:
rails g migration add_user_to_tester user:references
le champ de référence n'est pas reconnu. En bref, la question est: comment ajouter une colonne de référencement à une migration de rails à partir de la ligne de commande?
ruby-on-rails
activerecord
migration
Plancton
la source
la source
EDIT : Ceci est une réponse obsolète et ne devrait pas être appliquée pour Rails 4.x +
Vous n'avez pas besoin d'ajouter des références lorsque vous pouvez utiliser un identifiant entier pour votre classe référencée.
Je dirais que l'avantage d'utiliser des références au lieu d'un entier simple est que le modèle sera prédéfini avec appartient_to et que le modèle est déjà créé et ne sera pas affecté lorsque vous migrez quelque chose d'existant, le but est en quelque sorte perdu.
Donc, je ferais comme ça à la place:
Et puis ajoutez manuellement appartient_to: utilisateur dans le modèle du testeur
la source
Veuillez noter que vous aurez très probablement besoin d'un index sur cette colonne également.
la source
user.testers
vous pouvez omettre l'index.rails g migration ...
généréadd_reference :installs, :device, index: true
qui crée également l'index.Avec les deux étapes précédentes indiquées ci-dessus, il vous manque toujours la contrainte de clé étrangère. Cela devrait fonctionner:
la source
Vous pouvez utiliser des références dans une migration de modification. Ceci est un code Rails 3.2.13 valide:
cf: http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/change_table
la source
down
méthode, j'ai obtenuActiveRecord::IrreversibleMigration
lors de la restauration en utilisant Rails 3.2. J'ai également dû changerchange
pourup
.L'exécution
rails g migration AddUserRefToSponsors user:references
générera la migration suivante:la source
Lors de l'ajout d'une colonne, vous devez faire de cette colonne un entier et si possible vous en tenir aux conventions de rails. Donc, pour votre cas, je suppose que vous avez déjà un testeur et des modèles utilisateur, ainsi que des tables de testeurs et d'utilisateurs.
Pour ajouter la clé étrangère, vous devez créer une colonne entière avec le nom user_id (convention):
Ajoutez ensuite un appartient au modèle de testeur:
Et vous pouvez également ajouter un index pour la clé étrangère (c'est quelque chose que les références font déjà pour vous):
la source
Cela fera l'affaire:
la source
Vous pouvez ajouter des références à votre modèle via la ligne de commande de la manière suivante:
Cela générera un fichier de migration comme:
Cela fonctionne bien chaque fois que je l'utilise.
la source
Pour Rails 4
Le générateur accepte le type de colonne comme référence (également disponible en tant que
belongs_to
).Cette migration créera une
user_id
colonne et un index approprié:génère:
http://guides.rubyonrails.org/active_record_migrations.html#creating-a-standalone-migration
Pour Rails 3
Helper est appelé références (également disponible en tant que
belongs_to
).Cette migration créera une
category_id
colonne du type approprié. Notez que vous transmettez le nom du modèle et non le nom de la colonne. Active Record ajoute le_id
pour vous.Si vous avez des
belongs_to
associations polymorphes, les références ajouteront les deux colonnes requises:Ajoutera une colonne attachment_id et une
attachment_type
colonne de chaîne avec une valeur par défaut dePhoto
.http://guides.rubyonrails.org/v3.2.21/migrations.html#creating-a-standalone-migration
la source