35 votes

Rails : belongs_to vs has_one

J'ai une question de débutant sur les associations de rails.

J'ai un modèle Bug, et un modèle Status. Le modèle Status est essentiellement une table de paires clé/valeur. Parmi les choix possibles, je dirais que le modèle Bug has_one Status est le plus logique. Cependant, d'après este

Le contenu appartient à ContentTemplate. Allez sur et regardez comment j'ai décrit le problème, et vous verrez que cela fonctionne. Avec belongs_to, la table accepte la responsabilité de la clé étrangère. Ainsi, Content a un content_template_id. Et ContentTemplate n'a besoin de rien. Je peux le pointer à volonté. C'est fait.

Bug belongs_to Status serait plus approprié (puisque Bug devrait prendre la clé étrangère). Sémantiquement, son exemple a du sens, mais le mien n'en a aucun. S'agit-il simplement d'une bizarrerie de rails qui, dans cette situation, semble étrange, ou bien est-ce que je ne comprends pas quelque chose ou que je fais mal les choses ?

19voto

Chuck Points 138930

Oui, je pense que tu viens de trouver un scénario un peu bizarre dans Rails. Je suppose qu'il pourrait être utile de considérer le "statut" comme une sorte de catégorie à laquelle le bogue appartient - sous cet angle, cela a du sens.

9voto

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

2voto

Adam Byrtek Points 5791

Vous n'avez pas expliqué précisément quel type de relation entre Bug et Status vous souhaiteriez obtenir, mais je suppose que vous êtes intéressé par l'un des éléments suivants :

  • one-to-many : dans ce cas, il devrait y avoir has_many dans la classe Bug et belongs_to dans la classe d'état,
  • un-à-un : dans ce cas, il devrait y avoir has_one dans la classe Bug et belongs_to dans la classe d'état.

Dans les deux cas, Status contient la clé étrangère. Dans le second cas, la formulation est un peu étrange, car la relation biunivoque est en fait asymétrique (il devrait y avoir une clé étrangère d'un seul côté).

0voto

rnicholson Points 2110

Si Status n'est qu'une table de consultation/de valeurs clés, il semble que vous ayez besoin d'une habtm ( has_and_belongs_to_many ) entre le Statut et le Bug. Avec habtm, vous obtiendrez une relation de type bugs_statuses joindre une table qui a bug_id y status_id avec vos tableaux de bogues et de statuts.

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