2009-03-18 18 views
22

Gibt es etwas explizit falsch mit has_and_belongs_to_many Assoziationen in Schienen statt has_many: durch? Ich bin mir bewusst von thesearticlesdescribing Unterschiede und Arbeitsumgebungen, aber sie sind von 2006. Von Dingen, die ich auf SO gelesen habe, scheint es, dass Leute denken, dass alt und klobig ist, aber was ist, wenn eine einfache viele zu viele beitreten Kein Modell notwendig ist, was Sie suchen?has_and_belongs_to_many in Rails

Gedanken?

Antwort

29

has_and_belongs_to_many ist für einfache Viele-zu-Viele-Beziehungen gedacht.

has_many: through ist auf der anderen Seite für indirekte Eins-zu-viele-Beziehungen oder Viele-zu-viele-Beziehungen mit Eigenschaften gedacht.

Wenn Sie nur eine einfache Viele-zu-Viele-Beziehung suchen, kann ich keinen Grund sehen, has_and_belongs_to_many nicht zu verwenden.

Beispiel many-to-many-Beziehung:

Benutzer gehört zu null oder mehr Gruppen und Gruppe hat null oder mehr Mitglieder (Benutzer).

Beispiel vieler-zu-viele-Beziehung mit den Eigenschaften:

Benutzer gehört zu null oder mehr Gruppen und Gruppe hat null oder mehr Mitglieder mit den Rängen.

Zum Beispiel könnte Alice ein Administrator in Gruppe A und ein Moderator in Gruppe B sein. Sie können diese Eigenschaft in der Join-Tabelle speichern.

Beispiel indirekt eine Eins-zu-viele-Beziehung:

die Kategorie A hat keine oder mehr Untergruppen, und jede Unterkategorie hat null oder mehr Elemente.

Eine Kategorie hat daher null oder mehr Elemente durch ihre Unterkategorien.

Betrachten Sie diese Kategorien:

Lebensmittel → Obst, Gemüse
Früchte → Apple, Orange, usw.
Gemüse → Karotte, Sellerie usw.

daher:

Essen → Apfel, Orange, Möhre, Sellerie, etc.

+2

Um die Rekursion zu verstehen, müssen Sie zuerst die Rekursion verstehen. Ich denke, Ihre Antwort könnte klarer oder demonstrativ sein in Bezug auf Viele-zu-Viele-Beziehungen mit Eigenschaften vs. Viele-zu-Viele-Beziehungen ohne Eigenschaften. –

+3

Lassen Sie mich ein paar Beispiele hinzufügen. –

+0

+1, das hat mir auch sehr geholfen. –

3

Es ist nichts falsch daran, has_and_belongs_to_many zu verwenden, wenn Sie kein Join-Modell benötigen. Ich habe es gerade selbst bei einem aktuellen Projekt verwendet.

+0

wie kannst du das mit 'accept_nested_attribute_for' benutzen? danke – hqt

3

Ich würde HABTM niemals benutzen, nicht wegen der Sorge um die Eleganz, sondern weil ich mir vorstellen kann, in Zukunft Daten zu einer Beziehung hinzufügen zu wollen, auch wenn ich den Punkt jetzt nicht sehen kann. Wenn ich faul wäre, würde ich gerne in der Lage sein, einfach die Spalten zum Join hinzuzufügen, anstatt die Beziehungen neu zu bearbeiten und dann die Spalten hinzuzufügen.

+7

Niemals? "Ja wirklich?" Wie nie wie in "Ich benutze nie goto"? –

+0

Ich nehme an, wenn ich eine Beziehung aufbauen könnte, in der es logisch unmöglich wäre, Daten hinzuzufügen, könnte ich mich entscheiden, mit HABTM zu gehen. Ansonsten würde ich mit has_many: durchgehen. – srboisvert

3

Ich denke darüber auf diese Weise. Vorausgesetzt, dass Sie bereits haben festgestellt, dass Sie ein many-to-many-Modell benötigen:

X----1 
    __/ 
/
Y----2 
    __/ 
/ 
Z----3 

(x-> 1 y-> 1,2 z-> 2,3)

eine HABTM Beziehung verwenden wenn Sie NICHT Informationen über jede der Zeilen in meinem (hoffentlich erkennbaren) Bild oben speichern müssen.

Wenn Sie Informationen über diese Linien (Beziehungen) speichern müssen, verwenden Sie ein "durch".

Wenn Sie also nur sagen, dass Personen [XYZ] Projekte besitzen und ihnen gehören [123], aber zu Projekt 1 nichts über Person X sagen müssen, verwenden Sie ein HABTM.

Wenn Sie sagen wollen, dass Person X Projekt 1 hat und das Projekt an einem bestimmten Datum zugewiesen wurde, haben Sie plötzlich eine richtig für diese besondere Beziehung und besser nutzen HMT.

+3

+1 für süße Diagramm – jbnunn

+1

Hoho, danke! ASCII Grafiken für den Sieg! – Jon

Verwandte Themen