2010-03-05 21 views
6

Tôi mới dùng Moose và đang cố gắng sử dụng nó với DBIx :: Class. Tìm kiếm công việc truy vấn và cập nhật DBIC cơ bản, nhưng bất kỳ trình kích hoạt nào tôi cố gắng viết sẽ không được thực hiện khi tôi sửa đổi một thuộc tính.Kích hoạt Moose không kích hoạt khi sử dụng 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"; 

Tôi hy vọng sẽ thấy trình kích hoạt 'inin' in 'FOO', nhưng không có gì xảy ra. Nếu tôi loại bỏ DBIx :: Class từ gói thì trigger được thực hiện như mong đợi.

Tôi nghi ngờ rằng DBIx :: Lớp đang đặt giá trị theo cách ngăn kích hoạt kích hoạt.

Thật không may, tôi không có nhiều may mắn khi tìm kiếm tài nguyên về việc sử dụng DBIx :: Lớp học với Moose. Những gì tôi đã viết chủ yếu dựa trên những gì tôi tìm thấy tại DBIx::Class and Moose.

Tôi có sử dụng DBIx :: Lớp học và/hoặc Moose sai không? Có một ORM khác mà tôi nên sử dụng với Moose không?

Các gói phần mềm với tác nhân kích thích sẽ không cháy:

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

Dường như phương pháp được tạo tự động của DBIC sẽ ghi đè các phương thức được tạo tự động của Moose. Điểm moose là để ngăn chặn điều này, nhưng nó không thể làm điều đó khi một cái gì đó không sử dụng Moose. Có lẽ bạn chỉ muốn một "xung quanh" sửa đổi. – jrockway

Trả lời

-3

Bạn đã cố gắng sử dụng writer => \&_mod_isin để thay thế?

+0

Hy vọng rằng không, bởi vì sau đó chương trình sẽ chết tại thời gian biên dịch. – jrockway

2

Trước tiên, bạn gặp sự cố khi mở rộng lớp không phải Moose từ bên trong Moose. Đây là một vấn đề bởi vì DBIx :: Lớp không kế thừa từ Moose :: Object, vì vậy bạn sẽ không nhận được các phương thức Moose tiêu chuẩn như does. Xem Moose::Cookbook::Basics::Recipe11 để giải quyết vấn đề này.

Thứ hai, bạn có vấn đề lớn hơn là bạn có hai bộ ma thuật khác nhau đang cố tạo các chương trình con cho bạn. Bạn có Moose, có phép thuật tạo ra các lớp con isinsid, và bạn có DBIx :: Lớp, có phép thuật cũng tạo các lớp con isinsid thay thế các trình con mà Moose tạo ra.

Bạn có thể muốn soạn trong vai trò Moose với công cụ sửa đổi around, như được đề xuất.