Ajouter une migration de colonne de référence dans Rails 4

Un utilisateur a beaucoup de téléchargements. Je veux append une colonne à la table des uploads qui référence l’ user . A quoi devrait ressembler la migration?

Voici ce que j’ai Je ne sais pas si je devrais utiliser (1) :user_id, :int ou (2) :user, :references . Je ne suis même pas sûr que (2) fonctionne. J’essaie juste de faire cela de la manière “rail”.

 class AddUserToUploads < ActiveRecord::Migration def change add_column :uploads, :user_id, :integer end end 

Question pertinente à l’exception de Rails 3. Migrations Rails 3: ajout d’une colonne de référence?

Rails 4.x

Lorsque vous avez déjà des users et que vous uploads tableaux et souhaitez append une nouvelle relation entre eux.

Tout ce que vous avez à faire est de: simplement générer une migration en utilisant 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 end end 

Ensuite, exécutez la migration à l'aide de rake db:migrate . Cette migration prendra soin d’append une nouvelle colonne nommée user_id à la table des uploads (référençant la colonne d’ id dans la table des users ), PLUS elle appenda é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; bases de données relationnelles viennent à notre secours ici. Cela signifie que nous pouvons append des contraintes de clé étrangère au niveau de la firebase database et que cette firebase database rejette toute opération qui ne respecte pas cette intégrité référentielle définie. Comme @infoget l'a commenté, Rails 4.2 prend en charge le support natif des clés étrangères (intégrité référentielle) . Ce n'est pas obligatoire mais vous voudrez peut-être append une clé étrangère (très utile) à la référence que nous avons créée ci-dessus.

Pour append une clé étrangère à une référence existante , créez une nouvelle migration pour append 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 nouvelle 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 appenda une nouvelle clé étrangère à la colonne user_id de la table uploads . La clé fait référence à la colonne id de la table users .

REMARQUE: en plus de l'ajout d'une référence, vous devez 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 ). Active Record ne prend en charge que les clés étrangères à colonne unique et seuls les adaptateurs mysql , mysql2 et PostgreSQL sont actuellement pris en charge. N'essayez pas ceci avec d'autres adaptateurs comme sqlite3 , etc. Reportez-vous à Guides Rails: clés étrangères pour référence.

Rails 5

Vous pouvez toujours utiliser cette commande pour créer la migration:

 rails g migration AddUserToUploads user:references 

La migration est un peu différente de la précédente, 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

[Utiliser Rails 5]

Générer la migration:

 rails generate migration add_user_reference_to_uploads user:references 

Cela va créer 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 de schéma, vous verrez que la table des téléchargements contient un nouveau champ. Quelque chose comme: t.bigint "user_id" ou t.integer "user_id" .

Migrer la firebase database:

 rails db:migrate 

Si vous aimez une autre approche alternative avec down méthode up and down , 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 

Une autre syntaxe de faire la même chose est la suivante:

 rails g migration AddUserToUpload user:belongs_to