About

This page contains a single entry from the blog posted on October 2, 2007 12:47 PM.

The previous post in this blog was Neues aus der Modellier-Ecke.

The next post in this blog is Ein paar Gedanken zu Benutzerrollen.

Many more can be found on the main index page or by looking through the archives.

Powered by
Movable Type 3.31

« Neues aus der Modellier-Ecke | Main | Ein paar Gedanken zu Benutzerrollen »

Assoziation und Aggregation in Rails

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:
RailsClassAssociations.png
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
end
usw.

TrackBack

TrackBack URL for this entry:
http://www.innoq.com/movabletype/mt-tb.cgi/2776

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. ;-)

Was ist wenn man eine mehrfach Assoziation hat? Also eine Verbindung von einer Tabelle mit mehreren?
Schreibt man das dann einfach untereinander?

Post a comment

(If you haven't left a comment here before, you may need to be approved by the site owner before your comment will appear. Until then, it won't appear on the entry. Thanks for waiting.)