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?

244
demandé sur Community 2014-04-02 18:43:35

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.

577
répondu Kirti Thorat 2017-01-10 05:38:04

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

136
répondu Mirror318 2016-09-15 04:11:06

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
5
répondu Kiry Meas 2018-03-30 03:44:38

[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
4
répondu vantony 2017-10-23 11:01:23

une autre syntaxe de faire la même chose est:

rails g migration AddUserToUpload user:belongs_to
3
répondu Nadeem Yasin 2017-05-27 19:01:19