2009-05-22 19 views
35

Un po 'una domanda per principianti sulle associazioni di binari.Rails: belongs_to vs has_one

Ho un modello di bug e un modello di stato. Lo stato è fondamentalmente solo una tabella coppia chiave/valore. Tra le scelte disponibili, direi che Bug has_one Status ha più senso. Tuttavia, secondo this

Il contenuto appartiene a ContentTemplate. Vai indietro e guarda come ho descritto il problema , e vedrai che funziona. Con belongs_to, la tabella accetta la responsabilità per la chiave esterna. Quindi il contenuto di ha un content_template_id. E ContentTemplate non ha bisogno di nulla. Posso indicarlo a volontà. Fatto.

Il bug appartiene a Status sarebbe più appropriato (poiché Bug dovrebbe prendere la chiave esterna). Semanticamente, il suo esempio ha senso, ma il mio non ne fa alcuno. È solo una stranezza di binari in cui in questa situazione sembra strano o non capisco qualcosa/sto sbagliando?

risposta

18

Sì, penso che tu abbia appena trovato uno scenario un po 'strano in Rails. Suppongo che potrebbe essere utile vedere "status" come una sorta di categoria a cui appartiene l'errore: in quella luce, ha senso.

+3

Immagino sia una dimostrazione di quanto le rotaie funzionino semanticamente, che colpendo questa situazione ero come "Devo fare le cose sbagliate" –

0

Se Status è solo una tabella lookup/valori-chiave, sembra che si possa desiderare una relazione habtm (has_and_belongs_to_many) tra Stato e Bug. Con habtm, quello che ti ritrovi è una tabella di join bugs_statuses che contiene le colonne bug_id e insieme alle tabelle degli errori e degli stati.

+0

Questo vale per le relazioni molti-a-molti, che non è così. Questo è un molti-a-uno. La mia domanda è fondamentalmente intorno a ciò che la formulazione di quella relazione ha senso solo in uno-a-molti, non in molti-a-uno, e se c'è un modo più elegante per gestirlo. –

+0

Capito. Immagino che il mio tipico pensiero su "Bugs" e il loro "Status" sia che un Bug potrebbe essere in più stati contemporaneamente (ad esempio "worksforme" e "open") o si potrebbe voler mantenere la cronologia dello stato di un Bug. – 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

Il bug potrebbe prendere la chiave esterna perché uno stato può avere molti bug, ma un bug ha solo uno stato alla volta. – Chuck

+0

La tua nuova soluzione è come pensiamo alla situazione, ma non funzionerà. Quando esegui bug.status, cercherà una colonna bug_id nello stato, che non esiste. A has_one o has_many deve essere abbinato da un belongs_to nella classe che viene "avuta". – Chuck

+0

Come lo cambieresti? Sentiti libero di copiare la mia risposta nella tua e di apportare modifiche lì se preferisci. Sono solo curioso di sapere cosa pensi che dovrebbero essere i modelli. –

2

Lei non ha spiegato con precisione che tipo di rapporto tra il Bug e di stato che si desidera ottenere, ma suppongo che voi siete interessati a uno dei seguenti:

  • uno-a-molti: in questo caso ci dovrebbe essere has_many in classe Bug e belongs_to in classe Status,
  • one-to-one: in questo caso ci dovrebbe essere has_one in classe Bug e belongs_to in classe Status.

In entrambi i casi Stato contiene la chiave esterna. Nel secondo caso la formulazione è un po 'strana, a causa del fatto che la relazione uno-a-uno è in realtà asimmetrica (dovrebbe esserci un FK solo su un lato).

+1

Il problema è che un bug non ha molti stati alla volta, sia concettualmente che in una corretta implementazione. Concettualmente, pensiamo a uno stato come * appartenente a * molti bug, ma Rails può solo esprimere questo stato come uno stato con molti bug. – Chuck

+0

@chuck: Questo è praticamente tutto. Uno a molti contro molti a uno. Logicamente, praticamente equivalente, ma concettualmente c'è una differenza –