J'ai la migration Rails qui fonctionne parfaitement (pièces non pertinentes supprimées):
create_table :comments do |t|
t.text :body
t.references :post
end
Maintenant, je voudrais ajouter une colonne author
à ma table comments
(qui est l'ID utilisateur d'un utilisateur), mais je ne sais pas comment le faire (je suis tenté de simplement écrire la syntaxe spécifique à MySql en utilisant un execute
).
J'ai regardé add_column ici qui ne mentionne pas references
. J'ai en fait trouvé TableDefinition # références mais je ne sais pas comment l'utiliser avec un add_column
déclaration.
Est-ce possible? De plus, est-il vrai que, pour MySql, la fonctionnalité "références" n'établit pas réellement de relations entre les tables?
Bien qu'il soit trop tard pour en tirer des points, j'ai pensé publier le meilleur moyen pour la postérité :)
utilisation change_table
au lieu de create_table
pour ajouter des colonnes à une table qui existe déjà, avec toutes les qualités de TableDefinition:
self.up do
change_table :comments do |t|
t.references :author
end
end
Cela peut sembler trivial, mais d'autres gemmes comme Devise utilisent fortement leurs propres définitions de table personnalisées, et de cette façon, vous pouvez toujours les utiliser.
add_reference :table_name, :reference, index: true
Je l'ai finalement eu
add_column :locations, :state_id , :integer, :references => "states"
Tout d'abord, faites:
script/generate migration AddAuthorIdToComments
Ouvrez le fichier généré et ajoutez cette ligne:
add_column :comments, :author_id, :integer
Puis dans vos fichiers modèles:
class User < ActiveRecord::Base
has_many :comments, :foreign_key => "author_id"
end
class Comment
belongs_to :author, :class_name => User
end
Cela fait un moment que je n'ai pas regardé cela, mais la dernière fois que j'ai vérifié les migrations ne prennent pas en charge la création de clés étrangères. Heureusement, cependant, il existe un plug-in pour cela . Je l'ai utilisé et cela fonctionne bien.
Vous pouvez ajouter la colonne par add_column(:table, :column_name, :type, :options)
dans une nouvelle migration.