web-dev-qa-db-fra.com

add_column pour les références (Rails)

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?

60
Dan Rosenstark

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.

110
Jaime Bellmyer
add_reference :table_name, :reference, index: true
78

Je l'ai finalement eu

add_column :locations, :state_id , :integer, :references => "states"
34

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
21
Milan Novota

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.

2
Craig Stuntz

Vous pouvez ajouter la colonne par add_column(:table, :column_name, :type, :options) dans une nouvelle migration.

0
mike