2010-11-25 1 views
-1

Dies ist hauptsächlich eine theoritische Frage, aber wollte nur sicherstellen, dass ich es richtig mache. Stellen Sie sich ein Ruby-Rails-Projekt vor, bei dem es zwei Modelle gibt, das eine ist User und das andere ist Alliance.Ruby Rails Datenbank-Beziehungen - Eins zu viele

Ein Benutzer kann nur eine Allianz haben. Eine Allianz kann viele Benutzer haben.

Das ist sehr einfach eine: has_many,: gehört_zu Beziehung.

Allerdings finde ich, dass die Verwendung eines Zwischenmodells eine bessere Möglichkeit ist, dies zu tun. Das wäre ein: has_many: through: users_alliances, wobei users_alliances ein intermediäres Modell wäre.

Was denken Sie, ist der beste Weg, das zu tun?

Antwort

2

Verwenden Sie nicht HAUTM, es macht nicht die Verbindung in ein vollwertiges Modell, das ist, was Sie brauchen. Verwenden Sie has_many: through auf der Allianzseite und has_one: through auf der Benutzerseite.

Persönlich bevorzuge ich den Klassennamen AllianceMembership zu UserAlliance, aber Sie könnten beide verwenden. UsersAlliances ist hässlich obwohl imo. (Ein weiterer Vorteil von has_many/one: through ist, dass Sie die Join-Tabelle/Klasse beliebig aufrufen können).

Dies gibt Ihnen die Möglichkeit, später leicht zu Benutzern mit vielen Allianzen zu wechseln, wenn Sie möchten.

+0

Einfach toll, danke! Nur eine kleine Teilfrage. Wenn ich nuntm benutze, sehe ich, dass die dritte Tabelle automatisch ausgefüllt wird. Ich vermute, dass ich etwas falsch mache, aber wenn ich jetzt eine Allianz erstelle, sollte die Tabelle alliance_memberships nicht automatisch ausgefüllt werden? (Allianz ist Gerüst erzeugt). Und btw, alliance_memberships ist in der Tat viel besser, ich benutze das jetzt :) – Spyros

+0

hmm, na ja, ich denke, ich werde die neue AllianceMembership als das Objekt nutzen müssen, um die neue Mitgliedschaft der Allianz zu übergeben, duh: P Ich werde das versuchen, um sicherzugehen. – Spyros

+0

ahhh, hab es geschafft. "@ alliance.users << current_user", einfach toll :) – Spyros

0

Warum denkst du das? Was denkst du, wirst du vom Join-Modell profitieren?

Persönlich bezweifle ich, dass die zusätzliche Tabelle/das zusätzliche Modell hilfreich wäre, es sei denn, Sie denken, dass Eins-zu-Viele in der Zukunft viele-zu-viele werden.

+0

Die Idee ist, dass einige Informationen, die sich auf einen Benutzer in der Allianz beziehen, dort gespeichert werden sollten. Zum Beispiel, der Rang des Benutzers in der Allianz, ich denke, es ist besser, ein Teil der Join-Tabelle zu sein. Es ist expliziter, denke ich. – Spyros

+0

Sie haben einen Punkt. So ist es auch in World of Warcraft für Gilden gemacht. Sucht hier nach Tischgilden und Gildenmitgliedern: https://github.com/mangos/mangos/blob/master/sql/characters.sql – Vojto

+0

Ja, es ist genau so, wie ich es gedacht habe. Es scheint jedoch, dass es keine Dokumentation für diese Art von Beziehung gibt, und ich kann nicht wirklich die Zwischentabelle (users_alliances) automatisch gefüllt bekommen, wie es bei einer normalen Beziehung der Fall wäre. :/ – Spyros