Weil ich immer mal wieder eine Weile überlegen muss, wie nun genau die verschiedenenen Assoziationen wie has_one
, has_one
und has_and_belongs_to_many
gebildet werden (im Sinne der Fremdschlüssel in der Datenbank), hab ich hier mal eine Grafik aus meiner Bachelorarbeit angefügt, die vielleicht auch dem einen oder anderen Rubyisten unter euch eine Hilfe sein wird.
Well, here goes:
Oben ist die Klassen-Assoziation angegeben, in der Mitte der verwendete Ruby-Code und unten die Tabellen mit den Fremdschlüsseln.
Ergänzung zu Philipps Kommentar: Wenn man 10 Aggregationen hat, kommen die einfach nacheinander, genau. Man kann sich auch über die Namenskonventionen hinwegsetzen und z.B. die Fremdschlüssel- und Tabellennamen explizit angeben. Allerdings wollte ich hier jetzt keine Einführung in ActiveRecord geben, da verweise ich gerne auf die Doku ;-). Hier aber mal eine Beispielklasse meines Systembenutzers (siehe Klassendiagramm für Details):
class SystemUser < ActiveRecord::Base belongs_to :client has_and_belongs_to_many :system_groups has_many :user_access_rights has_one :reseller_account, :foreign_key => 'reseller_id' end
Oder hier die Assoziationen des AccessRights, hier sind die Zusammenhänge im Datenmodell etwas komplizierter. Die Vergknüpfung erfolgt über eine Tabelle, die mehr informationen als nur die Fremdschlüssel beeitstellt. Außerdem, um Daniels Kommentar zu würdigen, kann man so auch mit Verknüpfungstabellen arbeiten, deren Namen sich nicht aus der in alphabetisch richtiger Reihenfolge zusammengesetzten Namen der verknüpften Entitäten/Tabellen besteht:
class AccessRight < ActiveRecord::Base belongs_to :consolvix_module has_and_belongs_to_many :system_users, :join_table => 'user_access_rights', :foreign_key => 'access_right_id', :association_foreign_key => 'user_id' has_and_belongs_to_many :system_groups, :join_table => 'group_access_rights', :association_foreign_key => 'access_right_id', :foreign_key => 'group_id' end
class UserAccessRight < ActiveRecord::Base belongs_to :system_user, :foreign_key => 'user_id' has_one :access_right endusw.
Comments (2)
Hm...leider ist das Bild an einer Stelle etwas unglücklich:
links der Ruby-Code wird am Ende verschluckt.
Ansonsten kann man sowas auf jeden Fall gebrauchen, obwohl man evtl. noch erwähnen könnte, dass bei has_and_belongs_to_many die zusätzliche Tabelle in alphabetischer Reihenfolge erwartet wird, also AKlasse_BKlasse.
So...das war dann mein kleiner klugscheisserischer Beitrag dazu. ;-)
Posted by Daniel | October 2, 2007 1:43 PM
Posted on October 2, 2007 13:43
Was ist wenn man eine mehrfach Assoziation hat? Also eine Verbindung von einer Tabelle mit mehreren?
Schreibt man das dann einfach untereinander?
Posted by Philipp Haussleiter | October 2, 2007 4:42 PM
Posted on October 2, 2007 16:42