Bitte erläutern Sie den Unterschied zwischen has_and_belongs_to_many und has_many durch eine Beziehung. Wann und wo welches verwenden?
Bitte erläutern Sie den Unterschied zwischen has_and_belongs_to_many und has_many durch eine Beziehung. Wann und wo welches verwenden?
Antworten:
Soweit ich mich erinnern kann, erhalten has_and_belongs_to_manySie eine einfache Nachschlagetabelle, die auf Ihre beiden Modelle verweist.
Zum Beispiel,
Geschichten können zu vielen Kategorien gehören. Kategorien können viele Geschichten haben.
Categories_Stories Table
story_id | category_id
has_many :through gibt Ihnen ein drittes Modell, in dem verschiedene andere Informationen gespeichert werden können, die zu keinem der Originalmodelle gehören.
Zum Beispiel
Person kann viele Zeitschriften abonnieren. Zeitschriften können viele Abonnenten haben.
Somit können wir ein Abonnementmodell in der Mitte haben, das uns eine ähnliche Tabelle wie im vorherigen Beispiel gibt, jedoch mit zusätzlichen Eigenschaften.
Subscriptions Table
person_id | magazine_id | subscription_type | subscription_length | subscription_date
Und so weiter.
Die einfachste Faustregel lautet, dass Sie eine has_many: through-Beziehung einrichten sollten, wenn Sie mit dem Beziehungsmodell als unabhängige Entität arbeiten müssen. Wenn Sie mit dem Beziehungsmodell nichts tun müssen, ist es möglicherweise einfacher, eine Beziehung has_and_belongs_to_many einzurichten (obwohl Sie daran denken müssen, die Verknüpfungstabelle in der Datenbank zu erstellen). Sie sollten has_many: through verwenden, wenn Sie Validierungen, Rückrufe oder zusätzliche Attribute für das Join-Modell benötigen.
Meine Faustregel lautet: Kann ich hier mit einer Liste von Kontrollkästchen auskommen? Wenn ja, dann ist es eine habtm Vereinigung. Wenn ich das Kontrollkästchen benötige, um mehr über die Beziehung zu erfassen als nur Ja / Nein, zu der sie gehört, verwenden Sie has_many: through. HABTM ist so einfach wie die Verwendung der _ids-Methode mit einer simple_form collection_check_boxes. Has_many: durch beinhaltet oft akzeptiert_nested_attributes_for.
Sie sollten has_many: through verwenden, wenn Sie Validierungen, Rückrufe oder zusätzliche Attribute für das Join-Modell benötigen.
Viele der Antworten klarstellen, dass Sie verwenden sollten , has_and_belongs_to_manygegen , has_many through:wenn Sie irgendwelche zusätzlichen Daten nicht brauchen oder Validierungen auf den Tisch kommen.
Allerdings , passen diesen Ansatz zu nehmen. In den frühen Phasen der Anwendungsentwicklung ist dies nahezu unmöglich zu wissen, welche zusätzlichen Funktionen oder Validierungen Sie in der fernen Zukunft des Projektlebenszyklus benötigen. Wenn Sie sich für die Verwendung has_and_belongs_to_manyentschieden haben und zwei Jahre später einen einfachen Datenpunkt oder eine einfache Validierung hinzufügen möchten, ist die Migration dieser Änderung äußerst schwierig und fehleranfällig. Aus Sicherheitsgründen standardmäßighas_many :through
Nach meiner Erfahrung ist es immer besser zu verwenden, has_many: throughda Sie der Tabelle Zeitstempel hinzufügen können. Viele Male während einige Debug - ActiveRecordObjekte , die durch HABTM verbunden sind, mir fehlte created_at, updated_atZeitstempel den Schlüssel zu bekommen , was wirklich passiert ist . Denken Sie also daran, dass es Ihnen beim Debuggen und Untersuchen von Problemen mit Datenbeziehungen im Kontext der Zeit helfen kann, denn ohne sie sind Sie "blind", wenn Beziehungen erstellt oder aktualisiert wurden.