2009-05-14 7 views
57

Ich versuche has_one Beziehung in RoR zu verstehen.Unterschied zwischen has_one und gehört in Rails?

Sagen wir, ich habe zwei Modelle - Person und Cell:

class Person < ActiveRecord::Base 
    has_one :cell 
end 

class Cell < ActiveRecord::Base 
    belongs_to :person 
end 

Kann ich nur has_one :person anstelle von belongs_to :person in Cell Modell?

Ist es nicht das Gleiche?

+1

ein gutes [Blog hier] (http://requiremind.com/differences-between-has-one-and-belongs-to-in-ruby-on-rails/) für das gleiche! –

+0

Der obige Code ist falsch, sollte 'has_one: cell' und' gehört_zu: person' da sollte ** not ** ein Leerzeichen zwischen dem Doppelpunkt und dem folgenden Wort sein. – Josh

Antwort

142

Nein, sie sind nicht austauschbar, und es gibt einige echte Unterschiede.

belongs_to bedeutet, dass der Fremdschlüssel in der Tabelle für diese Klasse enthalten ist. So kann belongs_to NUR in die Klasse gehen, die den Fremdschlüssel enthält.

has_one bedeutet, dass in einer anderen Tabelle ein Fremdschlüssel vorhanden ist, der auf diese Klasse verweist. So kann NUR in eine Klasse gehen, die durch eine Spalte in einer anderen Tabelle referenziert wird.

Also das ist falsch:

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 

Das ist also:

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 

Für eine Zwei-Wege-Vereinigung, benötigen Sie einen von jedem, und sie haben in der richtigen Klasse zu gehen. Selbst für eine einseitige Verbindung ist es wichtig, welche Sie verwenden.

+0

Schöne Antwort. Als ich deine Antwort sehe, merke ich, dass ich die halbe Frage gelesen habe. Es tut mir leid, aber ich bin froh, dass du eingesprungen bist. + 10 –

+5

Ich musste das eine Milliarde Mal durchsehen. Ich wünschte, sie hätten die Namensgebung ein wenig besser durchdacht, um deutlicher zu machen, wohin man geht. –

+18

Großartig, jetzt kenne ich die zwei falschen Antworten. Wäre besser, den "richtigen" Weg zu zeigen, es zu zeigen. Ich sag bloß'. – y0mbo

7

Mit beiden können Sie Informationen von Personen- und Zellenmodellen abrufen.

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

Wenn Sie "gehört_zu" hinzufügen, erhalten Sie eine bidirektionale Verknüpfung. Das bedeutet, Sie können eine Person aus der Zelle und eine Zelle aus der Person holen.

Es gibt keinen wirklichen Unterschied, beide Ansätze (mit und ohne "gehört") verwenden das gleiche Datenbankschema (ein person_id Feld in der Zellen-Datenbanktabelle).

Zusammenfassend: Fügen Sie nicht "gehört_zu" hinzu, es sei denn, Sie benötigen bidirektionale Verknüpfungen zwischen Modellen.

+0

Die beste Zeile, die ich heute gelesen habe: "Wenn Sie" gehört_zu "hinzufügen, dann haben Sie eine bidirektionale Assoziation. Das bedeutet, Sie können eine Person aus der Zelle und eine Zelle von der Person bekommen." +1 –