Rails 4.x
Lorsque vous avez déjà users
et les uploads
tables et que vous souhaitez ajouter une nouvelle relation entre eux.
Tout ce que vous devez faire est de: générer simplement une migration à l'aide de la commande suivante:
rails g migration AddUserToUploads user:references
Ce qui créera un fichier de migration comme:
class AddUserToUploads < ActiveRecord::Migration
def change
add_reference :uploads, :user, index: true
end
end
Exécutez ensuite la migration à l'aide de rake db:migrate
. Cette migration se chargera d'ajouter une nouvelle colonne nommée user_id
à la uploads
table (référençant la id
colonne dans la users
table), PLUS elle ajoutera également un index sur la nouvelle colonne.
MISE À JOUR [Pour Rails 4.2]
On ne peut pas faire confiance aux rails pour maintenir l'intégrité référentielle; les bases de données relationnelles viennent à notre secours ici. Cela signifie que nous pouvons ajouter des contraintes de clé étrangère au niveau de la base de données elle-même et garantir que la base de données rejettera toute opération qui viole cette intégrité référentielle définie. Comme l'a commenté @infoget, Rails 4.2 est livré avec une prise en charge native des clés étrangères (intégrité référentielle) . Ce n'est pas obligatoire mais vous voudrez peut-être ajouter une clé étrangère (car c'est très utile) à la référence que nous avons créée ci-dessus.
Pour ajouter une clé étrangère à une référence existante , créez une nouvelle migration pour ajouter une clé étrangère:
class AddForeignKeyToUploads < ActiveRecord::Migration
def change
add_foreign_key :uploads, :users
end
end
Pour créer une toute nouvelle référence avec une clé étrangère (dans Rails 4.2) , générez une migration à l'aide de la commande suivante:
rails g migration AddUserToUploads user:references
qui va créer un fichier de migration comme:
class AddUserToUploads < ActiveRecord::Migration
def change
add_reference :uploads, :user, index: true
add_foreign_key :uploads, :users
end
end
Cela ajoutera une nouvelle clé étrangère à la user_id
colonne de la uploads
table. La clé fait référence à la id
colonne du users
tableau.
REMARQUE: cela s'ajoute à l'ajout d'une référence, vous devez donc toujours créer une référence, puis une clé étrangère ( vous pouvez choisir de créer une clé étrangère dans la même migration ou dans un fichier de migration distinct ). L'enregistrement actif prend uniquement en charge les clés étrangères à colonne unique et actuellement uniquement mysql
, mysql2
et les PostgreSQL
adaptateurs sont pris en charge. N'essayez pas ceci avec d'autres adaptateurs comme sqlite3
, etc. Référez-vous aux guides de rails: clés étrangères pour votre référence.
rails g migration AddUserToUploads user:references
produitadd_reference :uploads, :user, index: true, foreign_key: true
dans la migration appropriée....index: true, foreign_key: true
plutôt o lineadd_foreign_key
.foreign_key
ett.reference
? N'est-ce past.reference
essentiellement équivalent àforiegn_key
+index
?Rails 5
Vous pouvez toujours utiliser cette commande pour créer la migration:
La migration semble un peu différente de celle d'avant, mais fonctionne toujours:
Notez que ce n'est
:user
pas:user_id
la source
Local::User
au lieu deUser
faire quelque chose commerails g migration AddLocalUserToUploads user:references
.:index
t.index ["user_id"], name: "index_uploads_on_user_id", using: :btree
belongs_to :user
enUpload
classe, afin que nous puissions utiliserupload.user
pour obtenir l'instance utilisateur.si vous aimez une autre approche alternative avec
up
etdown
méthode essayez ceci:la source
[Utilisation de Rails 5]
Générez la migration:
Cela créera le fichier de migration:
Maintenant, si vous observez le fichier de schéma, vous verrez que la table des téléchargements contient un nouveau champ. Quelque chose comme:
t.bigint "user_id"
out.integer "user_id"
.Migrer la base de données:
la source
Une autre syntaxe pour faire la même chose est:
la source
Juste pour documenter si quelqu'un a le même problème ...
Dans ma situation, j'ai utilisé des
:uuid
champs et les réponses ci-dessus ne fonctionnent pas dans mon cas, car les rails 5 créent une colonne en utilisant à la:bigint
place:uuid
:la source
Créer un fichier de migration
Nom de clé étrangère par défaut
Cela créerait une colonne user_id dans la table des téléchargements en tant que clé étrangère
modèle d'utilisateur:
modèle de téléchargement:
Personnalisez le nom de la clé étrangère:
Cela créerait une colonne author_id dans les tables de téléchargement comme clé étrangère.
modèle d'utilisateur:
modèle de téléchargement:
la source