web-dev-qa-db-fra.com

Créer des relations lors de l'échafaudage

Salut, je suis nouveau à Ruby on Rails. J'essaie de créer un petit site de blog. J'ai deux tables Posts et Comments. Chaque message aura de nombreux commentaires. Je génère les tables en utilisant ces commandes.

Rails g scaffold Post title:string body:text author:string
Rails g scaffold Comment body:string author:string

Maintenant, je veux ajouter la relation aux classes de modèle. J'ajoute has_many :comments à la classe Post et belongs_to :title à la classe Comment. Cependant, lorsque j'essaie d'appeler post.comments, une erreur d'exécution indiquant SQLException: no such column: comments.post_id s'affiche. Devrais-je créer une migration et ajouter post_id sous Comment ou existe-t-il un moyen d'y parvenir lors d'un échafaudage?

30
Stefan Bossbaly

Scaffold fournit en fait un moyen de générer des relations, vous devriez utiliser le type de données :references

Rails g scaffold Comment body:string author:string post:references

Cela générera une migration pour la table de commentaires avec un champ post_id et un index pour celui-ci. Le générateur ajoutera également belongs_to :post au modèle Comment.

Cependant, cela ne générera pas le revers de la relation, vous devrez donc ajouter

has_many :comments

à la poste modèle vous-même. Vous devrez également ajouter le routage des ressources imbriquées si vous en avez besoin, car le générateur ne peut pas le gérer.

134
JamieD

Vous êtes vraiment sur la bonne voie. Si vous ajoutez la colonne post_id lors de la génération de l'échafaudage Comment, votre relation fonctionnera ensuite (bien que vous ayez toujours besoin d'ajouter les has_many :comments et belongs_to :post).

Ainsi, l'appel de générateur mis à jour ressemblerait à ceci:

Rails g scaffold Comment body:string author:string post_id:integer
9
agmin

Vous pouvez également utiliser belongs_to comme ceci:

Rails g scaffold Comment body:string author:string post:belongs_to
0
Jeremy Lynch