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?
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
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
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
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
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
L'exécution rails g migration AddUserRefToSponsors user:references
générera la migration suivante:
def change
add_reference :sponsors, :user, index: true
end
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
Qui fera l'affaire:
rails g migration add_user_to_tester user_id:integer:index
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..
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