Frage

Allgemeine Verwirrung
Ich habe Bands, die drei Gattungen haben. Ich las in einem vorherigen SO Post , dass die ordnungsgemäßen Weg zu handhaben ist ein paar Schritte:

1) In band.rb

has_and_belongs_to_many :genres
Erstellen

2) ein band_genres Join-Tabelle

Auch nach dem Lesen der Dokumentation, ich bin ein wenig verwirrt, was HABTM eigentlich bedeutet. Ich glaube, ich würde ganz normal denken „eine Band viele Genres hat“, nicht hat, gehört zu viele. So eine schnelle verdummt Erklärung das wäre toll.

Eine Verwechslung mit Fixtures

Auch wenn dabei meine Halterung für band_genres Ich habe

{ 
  "The Reaper Band and Funk": { "band": "The Reaper Band", "genre": "Funk" },
  "The Reaper Band and Rock": { "band": "The Reaper Band", "genre": "Rock" }  
}

Und ich bekomme eine „unbekannte“ Band Spalte. Ich dachte, Schienen sollte wissen, dass „The Reaper Band“ zu einem Band von einer Bandbefestigung (gleicher Namen natürlich) beziehen würde und dass die ID greift und weiß, dass „Band“ in dieser Leuchte beziehen würde in der Join-Tabelle band_id . Ich würde lieber sehen meine Leuchten wie diese als habe Zahlen hart codiert.

Verwirrung mit Fabriken

Wenn ich eine Band in meiner Fabrik schaffen, ich will es zuweisen Genres:

Factory.define :band do |f|
  f.sequence(:name) { |n| "Band#{n}" }
  f.mailing_lists { |mailing_lists| [mailing_lists.association(:mailing_list)] }
  f.genres 2
end

Ich weiß, hier würde ich wahrscheinlich brauchen eine hart codierte genre_id. Aber warum Schienen nicht das betrachten und sagen: „Oh, er will Genre hinzufügen mit id = 2 auf die band_genres Tabelle“.

ich nicht erwarte Schienen für mich an all die schmutzigen Arbeit zu kümmern, aber ich will nach den Regeln spielen.

War es hilfreich?

Lösung

  1. Hat und gehört zu viele, die die Beziehung in beiden Richtungen definiert. Wenn Sie nur sehen müssen, was genre die Band gehört, wird has_many in Ordnung sein. Wenn Sie wissen möchten, welche Bands sind „funk“, können Sie HABTM verwenden, um einen Nachschlag von Bands für ein bestimmtes Genre zu ermöglichen.
  2. Für Armaturen, in Schienen Sie jetzt HABTM, ohne eine gesonderte Halterung für die Join-Tabelle tun. Zum Beispiel:

in bands.yml:

reaper_band:
  name: The Reaper Band
  genres: funk, rock

in genres.yml:

funk:
  name: Funk
  bands: reaper_band

rock:
  name: Rock
  bands: reaper_band
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top