About

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

The previous post in this blog was ActiveRecord für Fortgeschrittenere.

The next post in this blog is Neue Benutzer Schritt für Schritt.

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

Powered by
Movable Type 3.31

« ActiveRecord für Fortgeschrittenere | Main | Neue Benutzer Schritt für Schritt »

Die Geschichte mit der Vererbung

Wie mittlerweile klar rübergekommen sein dürfte, umfasst Consolvix diverse Arten von Benutzern. EmailAccount, FtpAccount, Client etc. aggregieren alle ein User-Objekt, um vom System authentifiziert werden zu können. Um nun all diesen Objekten nach außen hin das "Aussehen" eines von User erbenden Objektes zu verpassen, verwende ich jetzt einfach sowas wie ein Proxy-Pattern, realisiert über ein "Mixin", also ein Ruby-Modul. Am Beispiel SystemUser HAS_ONE User sieht das so aus:

module UserInheriter
  # übernehme alle aus der Tabelle ermittelten Attribute ohne ID
  attributes = User.new.attribute_names - ['id']

  attributes.each do |attr|
    # generiere Lesemethode:
    define_method("#{attr}") do
      return self.user.send("#{attr}")
    end

    # generiere Schreibmethode:
    define_method("#{attr}=") do |param|
      return self.user.send("#{attr}=", param)
    end
  end
end

class SystemUser < ActiveRecord::Base
    has_one :user, :dependent => :destroy
  # ...
  include UserInheriter
  # ...
end

So wird jede Klasse, die das Modul UserInheriter importiert, um die Lese- und Schreibmethoden der User-Klasse erweitert. Natürlich bleibt der direkte Zugriff auf das User-Objekt weiterhin möglich.

Was später noch implermentiert werden sollte, ist die Unterscheidung zwischen public und protected Attribute sowie die Weiterreichung von Aggregierten Objekten. Das tut momentan aber noch nicht Not und darum wird's vorerst bei diesem Umfang bleiben.

TrackBack

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

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