Bitte erläutern Sie den Unterschied zwischen has_and_belongs_to_many und has_many durch eine Beziehung. Wann und wo welches verwenden?
quelle
Bitte erläutern Sie den Unterschied zwischen has_and_belongs_to_many und has_many durch eine Beziehung. Wann und wo welches verwenden?
Soweit ich mich erinnern kann, erhalten has_and_belongs_to_many
Sie 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.
Von http://guides.rubyonrails.org/association_basics.html#choosing-between-has-many-through-and-has-and-belongs-to-many
quelle
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.
quelle
Sie sollten has_many: through verwenden, wenn Sie Validierungen, Rückrufe oder zusätzliche Attribute für das Join-Modell benötigen.
quelle
Viele der Antworten klarstellen, dass Sie verwenden sollten ,
has_and_belongs_to_many
gegen ,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_many
entschieden 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
quelle
Nach meiner Erfahrung ist es immer besser zu verwenden,
has_many: through
da Sie der Tabelle Zeitstempel hinzufügen können. Viele Male während einige Debug -ActiveRecord
Objekte , die durch HABTM verbunden sind, mir fehltecreated_at
,updated_at
Zeitstempel 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.quelle