web-dev-qa-db-fra.com

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

Si je crée une nouvelle migration Rails 3 avec (par exemple)

Rails g migration tester title:tester user:references

, tout fonctionne bien ... cependant si j'ajoute une colonne avec quelque chose dans le sens de:

Rails g migration add_user_to_tester user:references

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

162
PlankTon

Si vous utilisez le 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 guides Rails

204
Paulo Fidalgo

EDIT: Ceci est une réponse obsolète et ne doit pas être appliqué pour Rails 4.x +

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

Je dirais que l’avantage d’utiliser des références au lieu d’un entier est que le modèle sera prédéfini avec appart_to et que, comme le modèle est déjà créé et qu’il ne sera pas affecté par la migration d’un élément existant, son objectif est en quelque sorte perdu.

Donc je ferais comme ceci à la place:

Rails g migration add_user_id_to_tester user_id:integer

Et ensuite ajouter manuellement Appartient_to: utilisateur dans le modèle de testeur

186
DanneManne

Veuillez noter que vous aurez probablement aussi besoin d'un index sur cette colonne.

class AddUserReferenceToTester < ActiveRecord::Migration
  def change
    add_column :testers, :user_id, :integer
    add_index  :testers, :user_id
  end
end
102
Eugene

Avec les deux étapes précédentes indiquées ci-dessus, il vous manque encore 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

Vous pouvez utiliser des références dans une migration de modification. Ceci est valide 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
gl03

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

def change
  add_reference :sponsors, :user, index: true
end
27
Wirwing

Cela fera l'affaire:

Rails g migration add_user_to_tester user_id:integer:index
8
masterweily

Lorsque vous ajoutez une colonne, vous devez en faire un entier et si possible vous en tenir aux conventions Rails. Donc, dans votre cas, je suppose que vous avez déjà un modèle de testeur et d’utilisateur, ainsi que des tables de testeurs et d’utilisateurs.

Pour ajouter la clé étrangère, vous devez créer une colonne entière nommée user_id (convention):

add_column :tester, :user_id, :integer

Ajoutez ensuite un appartient à le modèle de testeur:

class Tester < ActiveRecord::Base
  belongs_to :user
end

Et vous voudrez peut-être aussi ajouter un index pour la clé étrangère (les références le font déjà pour vous):

add_index :tester, :user_id
8
Zamith

Pour Rails 4

Le générateur accepte le type de colonne comme référence (également disponible sous la forme belongs_to).

Cette migration créera une colonne user_id et l'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 sous la forme belongs_to).

Cette migration créera une colonne category_id du type approprié. Notez que vous transmettez 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 belongs_to polymorphes, les références ajouteront les deux colonnes requises:

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

Ajoutera une colonne attachment_id et une chaîne 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
shilovk

Vous pouvez ajouter des références à votre modèle via une 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 bien chaque fois que je l'utilise ..

3
Neha