2010-05-06 13 views

Antwort

91

Soweit ich mich erinnern kann, gibt has_and_belongs_to_many Ihnen eine einfache Nachschlagetabelle, die auf Ihre zwei Modelle verweist.

Zum Beispiel

Geschichten können zu viele Kategorien gehören. Kategorien können viele Geschichten haben.

Categories_Stories Table 
story_id | category_id 

has_many :through gibt Ihnen ein drittes Modell, das verwendet werden kann, verschiedene andere Informationen zu speichern, die entweder nicht von den ursprünglichen Modellen gehören.

Zum Beispiel

Person kann viele Zeitschriften abonnieren. Zeitschriften können viele Abonnenten haben.

So können wir ein Subskriptionsmodell in der Mitte haben, die uns eine ähnliche Tabelle zu dem früheren Beispiel gibt, aber mit zusätzlichen Eigenschaften.

Subscriptions Table 
person_id | magazine_id | subscription_type | subscription_length | subscription_date 

Und so weiter.

+24

beachten Sie, dass die Tabelle in alphabetischer Reihenfolge benannt werden muss, d. H. Categories_stories-Tabelle im Gegensatz zu stories_categories - dies ist die Konvention, die es funktioniert. – Will

+0

Danke, ich habe meinen Beitrag jetzt geändert – Dan

+0

warum müssen sie alphabetisch @Will sein? – ctilley79

30

Von http://guides.rubyonrails.org/association_basics.html#choosing-between-has-many-through-and-has-and-belongs-to-many

Die einfachste Daumenregel ist, dass Sie eine has_many einrichten sollten: durch Beziehung, wenn Sie mit dem Beziehungsmodell als eigenständige Einheit arbeiten müssen. Wenn Sie mit dem Beziehungsmodell nichts anfangen müssen, ist es möglicherweise einfacher, eine has_and_belongs_to_many-Beziehung einzurichten (obwohl Sie daran denken müssen, die Verbindungstabelle in der Datenbank zu erstellen). Sie sollten has_many: through verwenden, wenn Sie Validierungen, Callbacks oder zusätzliche Attribute im Join-Modell benötigen.

+3

Ich würde auch hinzufügen, dass es viele Methoden Schienen Inserts zu has_and_belongs_to_many und nicht zu has_many: durch .Alle Methoden, wie das Zuweisen einer Sammlung von Werten zu der Verknüpfung, scheinen nicht in der Dokumentation für has_many: through http://guides.rubyonrails.org/association_basics.html#has_and_belongs_to_many-association-reference zu erscheinen – e3matheus

13

Meine Faustregel ist, kann ich hier mit einer Liste von Checkboxen auskommen? Wenn ja, dann ist es ein gutm Verein. Wenn ich das Kontrollkästchen brauche, um mehr über die Beziehung zu erfassen, als einfach Ja/Nein, dann gehört has_many: through. HABTM ist so einfach wie die _ids-Methode mit einer einfachen_sammlung_scan_boxes. Has_many: through beinhaltet oft accresents_nested_attributes_for.

4

Sie sollten has_many: through verwenden, wenn Sie Validierungen, Callbacks oder zusätzliche Attribute für das Join-Modell benötigen.