Je veux faire un migration
dans Rails, référençant une autre table. Habituellement, je ferais quelque chose comme:
add_column :post, :user, :references
Cela crée une colonne nommée user_id
dans la posts
table. Mais que faire si, au lieu de user_id
, je veux quelque chose comme author_id
? Comment puis je faire ça?
schema_plus
gem, at.references :category, index: true, foreign_key: true, references: :match_categories
également fonctionné pour moi dans le fichier de migration.Pour Rails 5+
Définition initiale:
Si vous définissez votre
Post
table modèle, vous pouvez définirreferences
,index
etforeign_key
sur une seule ligne:Mettre à jour existant:
Si vous ajoutez des références à une table existante, vous pouvez le faire:
Remarque: la valeur par défaut de
index
est true.la source
null
art. Pour ne pas les autoriser, ajoutez l'option habituellenull: false
.Dans Rails 4.2+, vous pouvez également définir des clés étrangères dans la base de données, ce qui est une excellente idée .
Pour les associations simples, cela peut être fait également en
t.references
ajoutantforeign_key: true
, mais dans ce cas, vous aurez besoin de deux lignes.la source
references: :users
option dans l'add_reference
appel. Je ne le vois pas documenté dans la documentation et il semble fonctionner de mon côté sans cela.Dans les rails 4, lorsque vous utilisez postgresql et le gem schema_plus, vous pouvez simplement écrire
Cela créera une colonne
author_id
, qui fait correctement référence àusers(id)
.Et dans votre modèle, vous écrivez
Notez que lors de la création d'une nouvelle table, vous pouvez l'écrire comme suit:
la source
create_table
:t.references :author, references: :users
:references
fasse quoi que ce soit.schema_plus
bijou depuis des lustres et il ajoute en fait cette fonctionnalité. J'ai modifié ma réponse en conséquence.t.references :col_name, references: other_table_name
fonctionne sans installer de gemmes supplémentaires.Si vous n'utilisez pas de clé étrangère, le nom réel de la table de l'autre table n'a pas d'importance.
À partir de Rails 5 , si vous utilisez une clé étrangère, vous pouvez spécifier le nom de l'autre table dans les options de clé étrangère. (voir https://github.com/rails/rails/issues/21563 pour discussion)
Avant Rails 5, vous devez ajouter la clé étrangère en tant qu'étape distincte:
la source
{to_table: :users}
alias_attribute (nouveau_nom, ancien_nom) est très pratique. Créez simplement votre modèle et la relation:
puis éditez le modèle et ajoutez un alias d'attribut avec
Après cela, vous pourrez exécuter des choses comme
la source