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.