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?
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
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
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
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
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
Cela fera l'affaire:
Rails g migration add_user_to_tester user_id:integer:index
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
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
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 ..