2010-03-05 13 views
6

Sono nuovo di Moose e sto provando a utilizzarlo con DBIx :: Class. Il lavoro di ricerca e aggiornamento DBIC di base trova, ma qualsiasi trigger che tento di scrivere non viene eseguito quando modifico un attributo.I trigger alci non attivano quando si utilizza DBIX :: Class

use Modern::Perl; 
use Data::Dumper; 

my $schema = My::Schema->connect(<connect str>, <usr>, <psw>) or die $!; 
my $rs = $schema->resultset('Isin')->search(sid => 3929); 
my $security_obj = $rs->first; 
print $security_obj->isin, "\n"; 
$security_obj->isin('Test1Foo'); # <- expect to see FOO printed by trigger 
print $security_obj->isin, "\n"; 

Mi aspetto di vedere il trigger per 'isin' print 'FOO', ma non succede nulla. Se spoglio DBIx :: Class dal pacchetto, il trigger viene eseguito come previsto.

Sospetto che DBIx :: Class stia impostando il valore in modo da impedire l'attivazione del trigger.

Purtroppo, non ho avuto molta fortuna a trovare risorse sull'utilizzo di DBIx :: Class con Moose. Quello che ho scritto è per lo più basato su ciò che ho trovato a DBIx::Class and Moose.

Sto usando DBIx :: Class e/o Moose errati? C'è un ORM diverso che dovrei usare con Moose?

Il pacchetto con il grilletto che il fuoco non sarà:

package My::Schema::Result::Isin; 

use DBIx::Class; 
use Moose; 
use Carp; 
extends 'DBIx::Class'; 

has 'isin' => (is => "rw", isa => "Str", trigger => \&_mod_isin); 
has 'sid' => (is => "ro", isa => "Int"); 

sub _mod_isin { 
    print "FOO\n"; 
    return; 
}; 

no Moose; 

__PACKAGE__->load_components('Core'); 

__PACKAGE__->table('isin'); 

__PACKAGE__->add_columns(
    isin => { data_type => 'varchar2', size => 12 }, 
    sid => { data_type => 'integer', size => 6 }, 
); 

__PACKAGE__->set_primary_key('isin'); 
+1

Sembra che i metodi generati automaticamente da DBIC stiano sovrascrivendo i metodi generati automaticamente da Moose. Il punto di Moose è prevenire questo, ma non può farlo quando qualcosa non usa Moose. Forse vuoi solo un modificatore "attorno". – jrockway

risposta

-3

Hai provato a usare writer => \&_mod_isin invece?

+0

Speriamo di no, perché poi il programma sarebbe morto al momento della compilazione. – jrockway

2

Innanzitutto, si ha il problema di estendere una classe non Moose da Moose. Questo è un problema perché DBIx :: Class non eredita da Moose :: Object, quindi non otterrai i metodi standard di Moose come does. Vedere Moose::Cookbook::Basics::Recipe11 per risolvere questo problema.

In secondo luogo, si ha il problema più grande di avere due diversi set di magia che stanno cercando di creare subroutine per voi. Hai Moose, la cui magia crea le subroutine isin e sid e hai DBIx :: Class, la cui magia crea anche le subroutine e sid che sostituiscono quelle create da Moose.

È possibile comporre un ruolo alci con un modificatore around, come suggerito da jrockway.

Problemi correlati