149 votes

Spécification du nom de la colonne dans une migration "références".

Je veux faire un migration dans Rails, en référençant une autre table. Habituellement, je fais quelque chose comme :

add_column :post, :user, :references

Cela crée une colonne nommée user_id en posts table. Mais que se passe-t-il si, au lieu de user_id je veux quelque chose comme author_id ? Comment puis-je le faire ?

314voto

Sheharyar Points 2063

Pour Rails 5+.

Définition initiale :

Si vous définissez votre Post vous pouvez définir references , index y foreign_key en une seule ligne :

t.references :author, index: true, foreign_key: { to_table: :users }

Mise à jour de l'existant :

Si vous ajoutez des références à une table existante, vous pouvez le faire :

add_reference :posts, :author, foreign_key: { to_table: :users }

Nota: La valeur par défaut pour index est vrai.

258voto

ecoologic Points 2748

Sur Rails 4.2+. vous pouvez également définir clés étrangères dans la base de données également, ce qui est une excellente idée .

Pour les associations simples, cela peut être fait également sur t.references en ajoutant foreign_key: true mais dans ce cas, vous aurez besoin de deux lignes.

# The migration
add_reference :posts, :author, index: true
add_foreign_key :posts, :users, column: :author_id

# The model
belongs_to :author, class_name: "User"

102voto

nathanvda Points 25878

Dans rails 4, lorsque l'on utilise postgresql et l'option schéma_plus gemme, vous pouvez simplement écrire

add_reference :posts, :author, references: :users

Cela créera une colonne author_id qui fait correctement référence à users(id) .

Et dans votre modèle, vous écrivez

belongs_to :author, class_name: "User"

Remarque : lors de la création d'un nouveau tableau, vous pouvez l'écrire comme suit :

create_table :things do |t| 
  t.belongs_to :author, references: :users 
end 

Remarque : le schema_plus dans son intégralité n'est pas compatible avec rails 5+, mais cette fonctionnalité est offerte par la gemme schema_auto_foreign_keys (partie de schema_plus) qui est compatible avec rails 5.

66voto

mschultz Points 853

Faites-le manuellement :

add_column :post, :author_id, :integer

mais maintenant, lorsque vous créez l'instruction belongs_to, vous devez la modifier, donc vous devez maintenant appeler

def post
    belongs_to :user, :foreign_key => 'author_id'
end

53voto

jes5199 Points 3108

Si vous n'utilisez pas de clé étrangère, le nom réel de l'autre table n'a pas d'importance.

add_reference :posts, :author

À partir de Rails 5 Si vous utilisez une clé étrangère, vous pouvez spécifier le nom de l'autre table dans les options de la clé étrangère. (voir https://github.com/rails/rails/issues/21563 pour discussion)

add_reference :posts, :author, foreign_key: {to_table: :users}

Avant Rails 5, vous devez ajouter la clé étrangère dans une étape distincte :

add_foreign_key :posts, :users, column: :author_id

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