Rails: belongs_to vs has_one
-
23-08-2019 - |
Question
Un peu d'une question de débutant sur les associations de rails.
J'ai un modèle de Bug, et un modèle d'état. Le statut est fondamentalement juste une table de paires clé / valeur. Sur les choix disponibles, je dirais Bug has_one Etat fait le plus de sens. Toutefois, selon cette
Contenu belongs_to ContentTemplate. Aller en arrière et voir comment je l'ai décrit la problème, et vous verrez que cela fonctionne. Avec belongs_to, la table accepte la responsabilité de la clé étrangère. Alors Contenu a content_template_id. Et ContentTemplate n'a pas besoin de quoi que ce soit. Je peux indiquer à volonté. Fait.
Bug belongs_to Etat serait plus approprié (puisque Bug devrait prendre la clé étrangère). Sémantiquement, son exemple est logique, mais le mien fait rien. Est-ce juste une bizarrerie de rails où, dans cette situation, il semble étrange, ou suis-je pas comprendre quelque chose / faire mal?
La solution
Oui, je pense que vous venez de trouver un scénario un peu bizarre dans Rails. Je suppose qu'il pourrait être utile de voir « statut » comme une sorte de catégorie à laquelle appartient le bug - dans cette optique, il est logique
.Autres conseils
TABLE:
Bug
id integer
desc string
status_id integer fk
Status
id integer
desc string
RAILS MODEL:
Bug
belongs_to :status
Status
has_many :bugs
Vous n'avez pas expliqué précisément ce genre de relation entre Bug et le statut que vous souhaitez obtenir, mais je suppose que vous êtes intéressé par un des éléments suivants:
- un à plusieurs: dans ce cas, il devrait être
has_many
en classe Bug etbelongs_to
dans la classe d'état, - one-to-one. Dans ce cas, il devrait être
has_one
en classe Bug etbelongs_to
dans la classe d'état
Dans les deux cas Statut contient la clé étrangère. Dans le second cas, la formulation est un peu bizarre, en raison du fait que l'un-à-un est en effet asymétrique (il devrait y avoir une FK sur un côté seulement).
Si l'état est juste une consultation / table valeur de clé, il semble que vous voudrez peut-être un HABTM (has_and_belongs_to_many
) entre le statut et Bug. Avec HABTM, ce que vous vous retrouverez avec est une bugs_statuses
table de jointure qui a des colonnes de bug_id
et status_id
avec vos bogues et tables statuts.