2009-05-14 20 views
57

Sto cercando di capire la relazione has_one in RoR.Differenza tra has_one e belongs_to in Rails?

Diciamo che ho due modelli - Person e Cell:

class Person < ActiveRecord::Base 
    has_one :cell 
end 

class Cell < ActiveRecord::Base 
    belongs_to :person 
end 

Posso solo usare has_one :person invece di belongs_to :person in Cell modello?

Non è lo stesso?

+1

un buon [blog qui] (http://requiremind.com/differenze-tra-solo-e-in-unione-per-in-ruby-on-rails/) per lo stesso! –

+0

Il codice sopra non è corretto, dovrebbe essere 'has_one: cell' e' belongs_to: person' dovrebbe ** non ** essere uno spazio tra i due punti e la seguente parola. – Josh

risposta

142

No, non sono intercambiabili e ci sono alcune differenze reali.

belongs_to significa che la chiave esterna è nella tabella per questa classe. Quindi belongs_to può andare SOLO nella classe che contiene la chiave esterna.

has_one significa che è presente una chiave esterna in un'altra tabella che fa riferimento a questa classe. Quindi has_one può andare SOLO in una classe a cui fa riferimento una colonna in un'altra tabella.

Quindi questo è sbagliato:

class Person < ActiveRecord::Base 
    has_one :cell # the cell table has a person_id 
end 

class Cell < ActiveRecord::Base 
    has_one :person # the person table has a cell_id 
end 

Quindi è questo:

class Person < ActiveRecord::Base 
    belongs_to :cell # the person table has a cell_id 
end 

class Cell < ActiveRecord::Base 
    belongs_to :person # the cell table has a person_id 
end 

Per un'associazione a due vie, è necessario uno di ciascuno, e devono andare nella classe giusta. Anche per un'associazione a senso unico, è importante quale si usa.

+0

Bella risposta. Vedendo la tua risposta mi rendo conto di aver letto metà della domanda. Mi dispiace, ma sono contento che tu abbia saltato dentro. + 10 –

+5

Ho dovuto cercare un miliardo di volte. Vorrei che avessero pensato un po 'meglio nel nominare, per rendere più chiaro in quale direzione andare. –

+18

Grande, ora conosco le due risposte sbagliate. Sarebbe meglio mostrare il modo "corretto" per mostrarlo. Basta dire. – y0mbo

7

L'utilizzo di entrambi consente di ottenere informazioni da entrambi i modelli Persona e Cell.

@cell.person.whatever_info and @person.cell.whatever_info. 
10

Se si aggiunge "belongs_to", allora si ha un'associazione bidirezionale. Ciò significa che puoi ottenere una persona dalla cella e una cellula dalla persona.

Non c'è alcuna differenza reale, entrambi gli approcci (con e senza "belongs_to") utilizzano lo stesso schema di database (un campo id_personale nella tabella del database delle celle).

Per riepilogare: non aggiungere "appartiene a" a meno che non siano necessarie associazioni bidirezionali tra i modelli.

+0

La linea migliore che ho letto oggi: "Se aggiungi" appartiene a "allora hai un'associazione bidirezionale, il che significa che puoi ottenere una persona dalla cella e una cella dalla persona." +1 –

Problemi correlati