Ajouter une colonne de référence migration dans les Rails 4
Un utilisateur a de nombreux téléchargements. Je veux ajouter une colonne au tableau uploads
qui fait référence au user
. À quoi doit ressembler la migration?
voilà ce que j'ai. Je ne sais pas si je dois utiliser (1) :user_id, :int
ou (2) :user, :references
. Je ne suis même pas sûr si (2) fonctionne. J'essaie juste de faire ça à la manière des" rails".
class AddUserToUploads < ActiveRecord::Migration
def change
add_column :uploads, :user_id, :integer
end
end
question pertinente sauf pour les Rails 3. Rails 3 migrations: ajout d'une colonne de référence?
5 réponses
Rails 4.x
lorsque vous avez déjà users
et uploads
tableaux et souhaitez ajouter une nouvelle relation entre eux.
tout ce que vous devez faire est de générer une migration en utilisant la commande suivante:
rails g migration AddUserToUploads user:references
qui créera un fichier de migration comme:
class AddUserToUploads < ActiveRecord::Migration
def change
add_reference :uploads, :user, index: true
end
end
ensuite, lancez le migration en utilisant rake db:migrate
.
Cette migration permettra d'ajouter une nouvelle colonne intitulée user_id
à la table uploads
(en référence à la colonne id
de la table users
) et d'ajouter un index à la nouvelle colonne.
mise à jour [pour Rails 4.2]
Rails ne peut pas faire confiance à maintenir l'intégrité référentielle; bases de données relationnelles viens à notre secours. Ce que cela signifie, c'est que nous pouvons ajouter des contraintes de clé étrangère au niveau de la base de données elle-même et nous assurer que la base de données rejetterait toute opération qui violerait l'intégrité référentielle de cet ensemble. Comme @infoget l'a commenté, Rails 4.2 navires avec support natif pour clés étrangères (intégrité référentielle) . Ce n'est pas nécessaire, mais vous pourriez vouloir ajouter clé étrangère(car c'est très utile) à la référence que nous avons créé ci-dessus.
Pour ajouter une clé étrangère d'une de référence , créer 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 référence entièrement avec une clé étrangère (dans les Rails 4.2) , générer une migration en utilisant la commande suivante:
rails g migration AddUserToUploads user:references
qui créera un fichier de migration comme:
class AddUserToUploads < ActiveRecord::Migration
def change
add_reference :uploads, :user, index: true
add_foreign_key :uploads, :users
end
end
ceci ajoutera une nouvelle clé étrangère à la user_id
colonne du tableau uploads
. La clé renvoie à la colonne id
du tableau users
.
NOTE: ceci est en plus d'ajouter une référence de sorte que vous avez toujours besoin de créer une référence d'abord puis clé étrangère ( vous pouvez choisir de créer une clé étrangère dans la même migration ou un fichier de migration séparé ). Active Record ne supporte que les clés étrangères à colonne simple et actuellement seulement Les adaptateurs mysql
, mysql2
et PostgreSQL
sont supportés. Ne pas essayer avec d'autres adaptateurs comme sqlite3
, etc. Référez-vous à Rails Guides: clés étrangères pour votre référence.
Rails 5
vous pouvez toujours utiliser cette commande pour créer la migration:
rails g migration AddUserToUploads user:references
la migration semble un peu différente d'avant, mais fonctionne toujours:
class AddUserToUploads < ActiveRecord::Migration[5.0]
def change
add_reference :uploads, :user, foreign_key: true
end
end
notez que c'est :user
, pas :user_id
si vous aimez une autre approche alternative avec up
et down
méthode essayez ceci:
def up
change_table :uploads do |t|
t.references :user, index: true
end
end
def down
change_table :uploads do |t|
t.remove_references :user, index: true
end
end
[Utilisant Des Rails 5]
Générer la migration:
rails generate migration add_user_reference_to_uploads user:references
cela créera le fichier de migration:
class AddUserReferenceToUploads < ActiveRecord::Migration[5.1]
def change
add_reference :uploads, :user, foreign_key: true
end
end
maintenant si vous observez le fichier schema, vous verrez que la table uploads contient un nouveau champ. Quelque chose comme: t.bigint "user_id"
ou t.integer "user_id"
.
Migrer la base de données:
rails db:migrate
une autre syntaxe de faire la même chose est:
rails g migration AddUserToUpload user:belongs_to