/ / Come sovrascrivere il "nuovo" metodo in DBIx :: Class Tables - perl, dbix-class

Come sovrascrivere il metodo "nuovo" in DBIx :: Class Tables - perl, dbix-class

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 № 1

Chiamerò 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.