61 votes

add_column pour les références (Rails)

J'ai le texte suivant Rails de la migration qui fonctionne parfaitement (pas pertinent morceaux supprimés):

create_table :comments do |t|
  t.text :body
  t.references :post
end

Maintenant, je voudrais ajouter un author colonne à ma comments tableau (qui est le nom d'un utilisateur), mais je n'ai aucune idée de comment faire (je suis tenté d'écrire la base de la syntaxe spécifique à l'aide d'un execute).

J'ai été à la recherche à add_column ici qui ne mentionne references. En fait, j'ai trouvé TableDefinition#références mais je n'ai aucune idée de comment l'utiliser avec un add_column déclaration.

Est-ce possible? Aussi, est-il vrai que, pour MySql, les "références" de la fonctionnalité n'a pas fait d'établir des relations entre les tables?

112voto

Jaime Bellmyer Points 13815

Alors qu'il est trop tard pour obtenir des points, je pensais que je poste la meilleure façon pour la postérité :)

utiliser change_table au lieu de create_table pour ajouter des colonnes à une table qui existe déjà, avec toutes les TableDefinition bonté:

self.up do
  change_table :comments do |t|
    t.references :author
  end
end

Cela peut sembler trivial, mais les autres pierres précieuses comme Concevoir de faire un usage intensif de leurs propres définitions de table, et de cette façon vous pouvez toujours les utiliser.

81voto

add_reference :table_name, :reference, index: true

36voto

Finalement obtenu

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

21voto

Milan Novota Points 10892

Tout d'abord, faire:

script/generate migration AddAuthorIdToComments

Ouvrez le fichier généré et ajouter cette ligne:

add_column :comments, :author_id, :integer

Alors dans vos fichiers de modèle:

class User < ActiveRecord::Base
  has_many :comments, :foreign_key => "author_id"
end

class Comment
  belongs_to :author, :class_name => User
end

2voto

Craig Stuntz Points 95965

Il a été un moment depuis que j'ai regardé ça, mais la dernière que j'ai vérifié les migrations ne prennent pas en charge la création de clés étrangères. Heureusement, cependant, il y a un plug-in pour elle. Je l'ai utilisé et ça marche bien.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X