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?
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.
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
Vous pouvez également utiliser belongs_to
comme ceci:
Rails g scaffold Comment body:string author:string post:belongs_to