Rails 3 migrations: ajout d'une colonne de référence?

si je crée un nouveau rail 3 migration avec (par exemple)

rails g migration tester title:tester user:references

, tout fonctionne très bien...cependant si j'ajoute une colonne avec quelque chose comme:

rails g migration add_user_to_tester user:references

le champ de référence n'est pas reconnu. En bref, la question est: comment ajouter une colonne de référencement à une migration des rails à partir de la ligne de commande?

160
demandé sur Simone Carletti 2011-02-10 11:46:55

10 réponses

si vous utilisez les Rails 4.x vous pouvez maintenant générer des migrations avec des références, comme ceci:

rails generate migration AddUserRefToProducts user:references

comme vous pouvez le voir sur rails guides

203
répondu Paulo Fidalgo 2016-08-29 13:55:28

EDIT : c'est une réponse périmée et ne devrait pas être appliquée pour Rails 4.x+

vous n'avez pas besoin d'ajouter des références lorsque vous pouvez utiliser un entier id pour votre classe référencée.

je dirais que l'avantage d'utiliser des références au lieu d'un entier simple est que le modèle sera prédéfini avec belongs_to et puisque le modèle est déjà créé et ne sera pas affecté quand vous migrerez quelque chose existant, le but est un peu perdu.

donc je ferais comme ceci à la place:

rails g migration add_user_id_to_tester user_id:integer

et ensuite ajouter manuellement belongs_to: user dans le modèle de testeur

186
répondu DanneManne 2015-12-04 06:29:37

veuillez noter que vous aurez très probablement besoin d'un index sur cette colonne aussi.

class AddUserReferenceToTester < ActiveRecord::Migration
  def change
    add_column :testers, :user_id, :integer
    add_index  :testers, :user_id
  end
end
101
répondu Eugene 2016-06-10 21:54:01

avec les deux étapes précédentes mentionnées ci-dessus, vous manquez toujours la contrainte de clé étrangère. Cela devrait fonctionner:

  class AddUserReferenceToTester < ActiveRecord::Migration
      def change
          add_column :testers, :user_id, :integer, references: :users
      end
  end
50
répondu Martin Cabrera Diaubalick 2013-04-30 16:04:38

vous can utilisez les références dans une migration de changement. Ceci est valable Rails 3.2.13 code:

class AddUserToTester < ActiveRecord::Migration
  def change
    change_table :testers do |t|
      t.references :user, index: true 
    end
  end
  def down
    change_table :testers do |t|
      t.remove :user_id
    end
  end
end

C. F.: http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/change_table

35
répondu gl03 2013-06-26 12:45:37

L'exécution rails g migration AddUserRefToSponsors user:references générera la migration suivante:

def change
  add_reference :sponsors, :user, index: true
end
27
répondu Wirwing 2016-06-10 21:52:30

lors de l'ajout d'une colonne, vous devez faire de cette colonne un entier et si possible coller avec les conventions rails. Donc pour votre cas, je suppose que vous avez déjà un testeur et des modèles D'Utilisateur, et des testeurs et des tables d'utilisateurs.

pour ajouter la clé étrangère vous devez créer une colonne entière avec le nom user_id (convention):

add_column :tester, :user_id, :integer

puis Ajouter un belongs_to au modèle de testeur:

class Tester < ActiveRecord::Base
  belongs_to :user
end

et vous pourriez aussi vouloir pour ajouter un index pour la clé étrangère (ce que les références font déjà pour vous):

add_index :tester, :user_id
8
répondu Zamith 2012-09-03 12:58:24

Qui fera l'affaire:

rails g migration add_user_to_tester user_id:integer:index
8
répondu masterweily 2013-07-03 10:06:24

Vous pouvez ajouter des références à votre modèle via la ligne de commande de la manière suivante:

rails g migration add_column_to_tester user_id:integer

cela générera un fichier de migration comme:

class AddColumnToTesters < ActiveRecord::Migration
  def change
    add_column :testers, :user_id, :integer
  end
end

Cela fonctionne très bien à chaque fois que je l'utilise..

3
répondu Neha 2013-05-29 08:54:19

Pour Rails 4

la génératrice accepte le type de colonne comme référence (également disponible en tant que belongs_to ).

cette migration créera une colonne user_id et un index approprié:

$ rails g migration AddUserRefToProducts user:references 

génère:

class AddUserRefToProducts < ActiveRecord::Migration
  def change
    add_reference :products, :user, index: true
  end
end

http://guides.rubyonrails.org/active_record_migrations.html#creating-a-standalone-migration

Pour Rails 3

Helper est appelé références (également disponible en tant que belongs_to ).

cette migration créera une colonne category_id du type approprié. Notez que vous passez le nom du modèle, pas le nom de la colonne. Active Record ajoute le _id pour vous.

change_table :products do |t|
  t.references :category
end

si vous avez des associations polymorphiques belongs_to , alors les références ajouteront à la fois: les colonnes requises:

change_table :products do |t|
  t.references :attachment, :polymorphic => {:default => 'Photo'}
end

va ajouter une colonne attachment_id et une chaîne de caractères attachment_type colonne avec une valeur par défaut de Photo .

http://guides.rubyonrails.org/v3.2.21/migrations.html#creating-a-standalone-migration

3
répondu shilovk 2015-10-13 10:58:12