Ho letto qui http://search.cpan.org/~frew/DBIx-Class-0.08200/lib/DBIx/Class/Manual/Cookbook.pod#Setting_default_values_for_a_row che un modo per impostare valori predefiniti per le colonne era quello di sovrascrivere il file nuovo metodo.
Il mio problema è che il mio nuovo metodo non viene mai chiamato.
User.pm
package MyApp::SchemaTest::Result::User;
use strict;
use warnings;
use base qw/DBIx::Class::Core/;
sub new {
die "new: @_";
}
__PACKAGE__->table("GECKO_USER");
__PACKAGE__->add_columns(
"user_id",
{ data_type => "integer", is_auto_increment => 1, is_nullable => 0 },
"first_name",
{ data_type => "varchar2", is_nullable => 0, size => 45 },
"last_name",
{ data_type => "varchar2", is_nullable => 0, size => 45 } );
__PACKAGE__->set_primary_key("user_id");
1;
test.pl
use Gecko2::SchemaTest;
my $schema = Gecko2::SchemaTest->connect("dbi:SQLite:$FindBin::Bin/../db/gecko2.sqlite");
ok($schema, "got schema");
my $user = $schema->resultset("User")->find( { login => "toto" });
use DDP;
p $user;
E ottengo l'oggetto $ user completamente costruito e operativo, il che significa che il mio metodo nuovo di zecca non viene mai chiamato. Perchè no ???
Ho provato a spostarlo ma senza successo ...
risposte:
2 per risposta № 1Chiamerò find un oggetto Result / Row costruito dai valori nel database. Il caso descritto nel ricettario è per la creazione di nuovi oggetti riga, ad es. chiamando $ rs-> create.
Perché vorresti sovrascrivere i valori provenienti dal database?
Si noti che è anche possibile impostare un valore predefinito per acolonna con l'attributo "valore predefinito". Questo non imposta il valore della colonna se si costruisce un oggetto riga con new_result ma si imposta il valore della colonna predefinita del database se si distribuisce il database con $ schema-> deploy.
Se vuoi impostare il valore per un nuovo oggetto riga, dai un'occhiata DBIx :: :: Classe DynamicDefault.
0 per risposta № 2
Alla fine ho trovato la soluzione: per controllare l'istanza di oggetti riga dal database / archiviazione, è necessario sovrascrivere il file inflate_default metodo.
Dal doc:
Tutti i metodi DBIx :: Class :: ResultSet che recuperano i dati da database e trasformarlo in oggetti riga chiamare questo metodo (* Inflate_default *).
Estendi questo metodo nelle classi dei risultati per agganciarti a questo processo, ad esempio per ribaltare il risultato in un'altra classe.
Naturalmente, se è necessario controllare l'istanza degli oggetti riga con il nuovo metodo, è necessario sostituirlo.
Per riassumere, se si desidera agganciare ogni possibile istanza di oggetti riga, è necessario sovrascrivere entrambi inflate_result e nuovo.