Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]744[/thread]

Aufrufen von Methoden einer übergeordneten Klasse: Object DBIx::ResultSet, will DBI::Class

Leser: 2


<< |< 1 2 >| >> 12 Einträge, 2 Seiten
Mangalore
 2006-06-02 11:55
#7828 #7828
User since
2006-05-09
17 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hallo, ich beisse mich derzeit durch Catalyst und Co und habe ein bisschen Probleme mit der etwas spärlichen Dokumentation.

Ich bin gerade auf ein Problem gestossen eine Methode augzurufen, die es mir erlaubt die Column-Namen eines Tables aus mysql zu bekommen. Für das Model in Catalyst benutze ich DBIx, die Tabellen sind in von DBIx::Class abgeleiteten Klassen.

Diese Klasse enthält die Methode 'columns' welche genau das obige ausführt.

In Catalyst wird die Ansteuerung von Objekten einer Webapplikation ja über ein Context-Object umgesetzt, wenn ich dieses aber aufrufe, um auf den Table zuzugreifen, bekomme ich ein DBIx::Class:ResultSet (Unterklasse von DBIx::Class) zurück und erhalte die Fehlermeldung:
DBIx::Class:ResultSet hat keine Methode "columns"

Zugriff auf den Table erfolgt so:
Code: (dl )
my $result = [$c->model('testDB::NameDesTable')->all]; 


Wobei 'testDB::NameDesTable' der Name der Tabelle ist und model() eine Catalyst-Methode, um das entsprechende Model-Objekt aufzurufen.

Anfang von NameDesTable.pm (Model der Tabelle):

Code: (dl )
1
2
3
package testDB::NameDesTable;

use base qw/DBIx::Class/;


Bei der Model-Definition wird aber eigentlich die DBIx::Class eingebunden, also scheint Catalyst von sich aus bei dem Zugriff auf eine Tabelle nur ein DBIx::Class:Resultset zurückzugeben.


Lange Rede, kurzer Sinn, gibt es irgendeine Möglichkeit (in Catalyst oder Perl allgemein) das ganze auf die Überklasse zu 'casten' bzw. die dahinterstehende Klasse zurückzubekommen, um deren Methoden verwenden zu können?


Danke für alle Anregungen, Ideen, Beschimpfungen!

[edit=betterworld]code-tags[/edit]\n\n

<!--EDIT|betterworld|1149236309-->
esskar
 2006-06-02 13:21
#7829 #7829
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
es wird empfohlen, anstatt von DBIx::Class von DBIx::Class::Schema abzuleiten. schau am besten in die pod: CPAN:DBIx::Class::Schema
Gast Gast
 2006-06-02 13:27
#7830 #7830
@esskar: Nicht ganz. Wenn du in das von dir verlinkte Dokument
schaust, steht da drin, dass die *Tabellen* DBIx::Class als Basis
haben.

@Mangalore: Versuch $resultset->result_source->columns
esskar
 2006-06-02 13:30
#7831 #7831
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
stimmt; verpeilt;
Mangalore
 2006-06-02 14:12
#7832 #7832
User since
2006-05-09
17 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=Guest,02.June.2006, 11:27]...

@Mangalore: Versuch $resultset->result_source->columns[/quote]
Danke, das funktioniert, aber dumme Frage: Habe ich da bloss Glück, dass es im ResultSet sowas gibt oder ginge das theoretisch bei Perl auch anders?
Gast Gast
 2006-06-02 14:18
#7833 #7833
Das ist eine reine Designsache und hat überhaupt nichts mit Perl
an sich zu tun.
Mangalore
 2006-06-02 17:14
#7834 #7834
User since
2006-05-09
17 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=Guest,02.June.2006, 12:18]Das ist eine reine Designsache und hat überhaupt nichts mit Perl
an sich zu tun.[/quote]
Da ich von Java her komme meinte ich eher, ob es in Perl Klassenvererbung gibt, aber nachdem ich jetzt mir zu diesem Catalystkonstrukt noch ein wenig angeschaut habe scheint es wohl nichts mit Klassenvererbung zu tun zu haben, oder?

Im konkreten Fall: Könnte man von einem DBIx::Class::ResultSet-Objekt auch auf die Methoden der DBIx::Class zugreifen? zumindest hier ging es nicht, ich weiss bloss nicht ob es an Sicherungen von Catalyst liegt oder allgemein nicht existiert.\n\n

<!--EDIT|Mangalore|1149254256-->
renee
 2006-06-02 21:50
#7835 #7835
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Grundsätzlich gibt es Vererbung in Perl. Dazu gibt es zwei Wege:

Weg 1
Code: (dl )
1
2
3
package SubKlasse;
use SuperKlasse;
our @ISA = qw(SuperKlasse);


Weg 2 (schöner und besser):
Code: (dl )
1
2
3
package SubKlasse;

use base qw(SuperKlasse);


Wenn jemand noch andere Wege kennt, dann bitte hier posten...\n\n

<!--EDIT|renee|1149275647-->
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
pq
 2006-06-02 22:23
#7836 #7836
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
renee: beim ersten beispiel fehlt dir noch use SuperKlasse. unter anderem
deswegen ist use base besser.

noch ein weg:
Code: (dl )
push @MyPackage::ISA, 'SuperKlasse';

das braucht man aber eigentlich nur bei dynamischer generierung von
vererbung.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
renee
 2006-06-02 23:13
#7837 #7837
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
stimmt, ist mir auf die schnelle entfallen...

Den dritten Weg kannte ich noch nicht... Das muss ich mir mal anschauen...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< |< 1 2 >| >> 12 Einträge, 2 Seiten



View all threads created 2006-06-02 11:55.