205 votes

générer un modèle en utilisant utilisateur: références vs utilisateur_id: entier

Je suis confus sur la façon de générer un modèle qui appartient à un autre modèle. Mon livre utilise cette syntaxe pour associer Micropost à Utilisateur:

 rails generate model Micropost user_id:integer
 

mais http://guides.rubyonrails.org/ dit de le faire comme ceci:

 rails generate model Micropost user:references
 

Les migrations générées par ces 2 sont différentes. Aussi, dans le premier cas, comment les rails savent-ils que user_id est une clé étrangère référençant un utilisateur? Merci!

211voto

Jon M. Points 1518

Les deux généreront les mêmes colonnes lors de l'exécution de la migration. Dans la console de rails, vous pouvez voir que c'est le cas:

 :001 > Micropost
=> Micropost(id: integer, user_id: integer, created_at: datetime, updated_at: datetime)
 

La deuxième commande ajoute une relation "appartient à l'utilisateur" dans votre modèle Micropost, contrairement à la première. Lorsque cette relation est spécifiée, ActiveRecord supposera que la clé étrangère est conservée dans la colonne "user_id" et utilisera un modèle nommé "User" pour instancier l'utilisateur spécifique.

17voto

Krule Points 4374

Pour le premier, de la convention plutôt que configuration". Rails par défaut lorsque vous faites référence à une autre table avec

 belongs_to :something

est de regarder pour something_id.

references est en fait la nouvelle façon d'écrire l'ancien avec quelques bizarreries.

À partir de Rails de code:

TableDefinition#références ajoutera un bien-nommée _id colonne, plus un correspondant _type de la colonne si l' :polymorphe option est fournie. Si :polymorphe est un hachage des options, celles-ci seront utilisées lors de la création de la _type de la colonne.

L'Important est de se rappeler qu'il ne va pas créer des clés étrangères pour vous.

Les références helper ne crée pas de contraintes de clés étrangères pour vous. Vous aurez besoin d'utiliser d'exécuter ou d'un plugin qui ajoute le support des clés étrangères.

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