Триггеры Moose не срабатывают при использовании DBIX :: Class - PullRequest
6 голосов
/ 06 марта 2010

Я новичок в Moose и пытаюсь использовать его с DBIx :: Class. Основная работа по поиску и обновлению DBIC находит, но любой триггер, который я пытаюсь записать, не выполняется при изменении атрибута.

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";

Я ожидаю увидеть триггер для 'isin' print 'FOO', но ничего не происходит. Если я удаляю DBIx :: Class из пакета, триггер выполняется должным образом.

Я подозреваю, что DBIx :: Class устанавливает значение таким образом, чтобы предотвратить срабатывание триггера.

К сожалению, мне не повезло найти ресурсы об использовании DBIx :: Class с Moose. То, что я написал, в основном основано на том, что я нашел в DBIx :: Class and Moose .

Я использую DBIx :: Class и / или Moose неправильно? Есть ли другой ORM, который я должен использовать с Moose?

Пакет с триггером, который не сработает:

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');

Ответы [ 2 ]

2 голосов
/ 27 августа 2010

Во-первых, у вас есть проблема расширения класса не-Moose из Moose. Это проблема, потому что DBIx :: Class не наследуется от Moose :: Object, поэтому вы не получите стандартные методы Moose, такие как does. См. Moose :: Cookbook :: Basics :: Recipe11 для решения этой проблемы.

Во-вторых, у вас есть большая проблема - у вас есть два различных набора магии, которые пытаются создать подпрограммы для вас. У вас есть Moose, чья магия создает подпрограммы isin и sid, и у вас есть DBIx :: Class, чья магия также создает подпрограммы isin и sid, которые заменяют те, которые создал Moose.

Возможно, вы захотите сочинить в роли лося с модификатором around, как предложил jrockway.

0 голосов
/ 06 марта 2010

Вы пробовали использовать writer => \&_mod_isin вместо?

...