2009-05-22 14 views
35

Ein bisschen ein Newbie Frage auf Schienen Verbände.Schienen: gehört zu_to vs has_one

Ich habe ein Fehlermodell und ein Statusmodell. Der Status ist im Grunde genommen nur eine Schlüssel/Wert-Paar-Tabelle. Aus den verfügbaren Möglichkeiten würde ich sagen, dass Bug has_one Status am sinnvollsten ist. Gemäß this

Inhalt gehört zu ContentTemplate. Gehen Sie zurück und schauen Sie sich an, wie ich das Problem beschrieben habe, und Sie werden sehen, dass es funktioniert. Mit oars_to akzeptiert die Tabelle Verantwortung für den Fremdschlüssel. So Inhalt hat eine content_template_id. Und ContentTemplate benötigt nichts. Ich kann darauf nach Belieben zeigen. Erledigt.

Fehler gehört zu Status (Bug sollte den Fremdschlüssel übernehmen). Semantisch macht sein Beispiel Sinn, aber meiner macht keinen. Ist das nur eine eigenartige Spur von Schienen, wo es in dieser Situation seltsam aussieht, oder verstehe ich etwas nicht/mache ich falsch?

Antwort

18

Ja, ich denke, Sie haben gerade ein etwas seltsam aussehendes Szenario in Rails gefunden. Ich denke, es könnte nützlich sein, "Status" als eine Art Kategorie zu sehen, zu der der Fehler gehört - in diesem Licht macht es Sinn.

+3

Ich denke, es ist ein Beweis dafür, wie schön rails semantisch funktioniert, dass ich in dieser Situation war wie "Ich muss es falsch machen" –

0

Wenn Status nur eine Nachschlage-/Schlüsselwerttabelle ist, klingt es nach einer habtm (has_and_belongs_to_many) Beziehung zwischen Status und Fehler. Mit hattm, was Sie am Ende mit einer bugs_statuses Join-Tabelle, die bug_id und status_id Spalten zusammen mit Ihren Bugs und Status Tabellen hat.

+0

Das ist für viele-zu-viele-Beziehungen, die das nicht ist. Dies ist ein Viele-zu-Eins. Meine Frage besteht im Grunde nur darin, dass die Formulierung für diese Beziehung nur in einem Eins-zu-Viele Sinn macht, nicht in einem Viele-zu-Eins, und wenn es einen eleganteren Weg gibt, damit umzugehen. –

+0

Verstanden. Ich denke, mein typisches Denken über "Bugs" und ihren "Status" ist, dass ein Bug in mehreren Status gleichzeitig sein könnte (zB "worksforme" und "open") oder Sie möchten den Verlauf eines Bug-Status behalten. – rnicholson

9
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 
+2

Fehler würde den Fremdschlüssel übernehmen, weil ein Status viele Fehler haben kann, aber ein Fehler hat immer nur einen Status. – Chuck

+0

Ihre neue Lösung ist, wie wir über die Situation denken, aber es wird nicht funktionieren. Wenn Sie bug.status ausführen, sucht es nach einer bug_id-Spalte im Status, die nicht existiert. Ein has_one oder has_many muss in der Klasse, die "had" hat, mit einem "sounds_to" übereinstimmen. – Chuck

+0

Wie würden Sie es ändern? Fühlen Sie sich frei, meine Antwort in Ihre zu kopieren und dort Änderungen vorzunehmen, wenn Sie bevorzugen. Ich bin nur neugierig zu wissen, wie die Modelle aussehen sollen. –

2

Sie erklären nicht genau, welche Art von Beziehung zwischen Bug und Status Sie erhalten möchten, aber ich nehme an, Sie in eine der folgenden interessiert sind:

  • one-to-many: in dieser Fall sollte es has_many in Bug-Klasse und belongs_to in der Statusklasse sein,
  • one-to-one: in diesem Fall gibt has_one in Bug-Klasse und belongs_to in der Statusklasse sein sollte.

In beiden Fällen enthält Status den Fremdschlüssel. Im zweiten Fall ist der Wortlaut etwas seltsam, da die Eins-zu-eins-Beziehung tatsächlich asymmetrisch ist (es sollte nur auf einer Seite ein FK sein).

+1

Das Problem ist, dass ein Fehler nicht viele Zustände gleichzeitig hat, entweder konzeptionell oder in eine ordnungsgemäße Umsetzung. Konzeptionell denken wir an einen Status *, der zu vielen Bugs gehört, aber Rails kann dies nur als einen Status mit vielen Bugs ausdrücken. – Chuck

+0

@chuck: Das ist es ziemlich viel. Eins-zu-Viele vs Viele-zu-Eins. Logisch, ziemlich gleichwertig, aber konzeptionell gibt es einen Unterschied –