Primärschlüsselspaltennamen aus Meta-Informationen holen
authorMoritz Bunkus <m.bunkus@linet-services.de>
Fri, 22 Jun 2012 08:30:00 +0000 (10:30 +0200)
committerMoritz Bunkus <m.bunkus@linet-services.de>
Fri, 22 Jun 2012 08:30:00 +0000 (10:30 +0200)
commita867016676febc197579586e202ddaac84bb7d50
tree2aab326f9ea0b9065cfc8d099beac571d7fe6285
parentf1d475ffb030169788f9e9a91772d1e1ce5134da
Primärschlüsselspaltennamen aus Meta-Informationen holen

Benutzerdefinierte Variablen verweisen auf die Primärschlüsselspalte
ihrer Bezugstabelle. Dieser Spaltenname kann beim Helper mit der
Option 'id' überschrieben werden. Allerdings defaultete er vorher auf
'id', was für viele Tabellen stimmte, nicht aber z.B. für 'contacts',
wo es die Spalte 'cp_cv_id' ist.

Für 'contacts' passierte dann Folgendes, wenn man
'$contact->custom_variables' aufrief:

Die Funktion 'custom_variables' ist eine one-to-many-Relation, sie
erfordert also einen DB-Zugriff. Dafür wird die Spaltenbeziehung
'cvar.trans_id == contacts.primary_key_column_name' herangezogen. Der
'primary_key_column_name' ist nicht angegeben, Defaultwert ist
'id'. RDBO versucht also, die Spalte 'id' aus dem Objekt '$contact'
auszulesen, mappt dafür den Spaltennamen auf den Methodennamen dafür.

Dieses Mapping liefert den leeren String. Das überprüft RDBO in dem
Moment aber nicht, sondern ruft "$object->$method()" auf. Das wirft
eine Exception, RDBO fängt diese ab, überprüft dann, ob '$AUTOLOAD'
einen Paketnamen enthält. Und dann kommt diese wenig erhellende
Fehlermeldung heraus:

Can't locate object method "Contact::" via package "SL::DB" at /usr/share/perl5/Rose/DB/Object.pm line 1646
SL/DB/Helper/CustomVariables.pm