Je ne sais pas comment générer un modèle qui appartient à un autre modèle. Mon livre utilise cette syntaxe pour associer Micropost à User:
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. De plus, pour le premier, comment les rails savent-ils qu'il user_id
s'agit d'une clé étrangère référençant user
? Merci!
la source
Rails lui-même ne sait pas qu'il
user_id
s'agit d'un référencement de clé étrangèreuser
. Dans la première commande,rails generate model Micropost user_id:integer
il ajoute uniquement une colonne,user_id
mais les rails ne connaissent pas l'utilisation du col. Vous devez mettre manuellement la ligne dans leMicropost
modèleles mots-clés
belongs_to
ethas_many
déterminer la relation entre ces modèles et déclareruser_id
comme clé étrangère auUser
modèle.La dernière commande
rails generate model Micropost user:references
ajoute la lignebelongs_to :user
dans leMicropost
modèle et déclare par la présente comme clé étrangère.FYI La
déclaration des clés étrangères en utilisant l'ancienne méthode permet uniquement aux Rails de connaître la relation entre les modèles / tables. La base de données est inconnue sur la relation. Par conséquent, lorsque vous générez les diagrammes EER à l'aide d'un logiciel comme
MySql Workbench
vous constatez qu'il n'y a pas de fils de relation dessinés entre les modèles. Comme dans la photo suivanteCependant, si vous utilisez la méthode ultérieure, vous constatez que votre fichier de migration ressemble à:
La clé étrangère est désormais définie au niveau de la base de données. et vous pouvez générer des
EER
diagrammes appropriés .la source
add_foreign_key
action par une optionforeign_key: true
à lat.references
ligne, ce qui impliqueindex: true
. Il en est ainsi maintenantt.references :user, foreign_key: true
. Il n'y a actuellement aucune documentation pour l'foreign_key
option disponible, donc ce n'est que mon hypothèse.add_reference
action a une:foreign_key
option qui ajoute une contrainte de clé étrangère appropriée . Je suppose que cette option ferait la même chose lors de la création d'une table.add_foreign_key :microposts, :users
fait-il une différence pour les rails?Pour le premier, convention sur la configuration. Rails par défaut lorsque vous référencez une autre table avec
est à rechercher
something_id
.references
, oubelongs_to
est en fait une manière plus récente d'écrire la première avec quelques bizarreries.Il est important de se rappeler qu'il ne créera pas de clés étrangères pour vous. Pour ce faire, vous devez le configurer explicitement en utilisant soit:
ou (notez le pluriel):
la source
:polymorphic
option (ce à mon humble avis, dans la plupart des cas, n'est pas une bonne idée). Si vous souhaitez utiliser des clés étrangères dans ActiveRecord, utilisez un étranger .add_foreign_key
est devenu ActiveRecord.