2010-03-05 8 views
6

का उपयोग करते समय मूस ट्रिगर्स फायरिंग नहीं कर रहे हैं मैं मूस के लिए नया हूं और इसे डीबीआईएक्स :: कक्षा के साथ उपयोग करने की कोशिश कर रहा हूं। बेसिक डीबीआईसी क्वेरीिंग और काम ढूंढने को अद्यतन करता है, लेकिन जब भी मैं एक विशेषता संशोधित करता हूं तो लिखने का प्रयास करने वाला कोई भी ट्रिगर निष्पादित नहीं होता है।डीआईबीएक्स :: कक्षा

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' प्रिंट 'फू' के लिए ट्रिगर देखने की उम्मीद है, लेकिन कुछ भी नहीं होता है। यदि मैं पैकेज से डीबीआईएक्स :: कक्षा को बाहर निकालता हूं तो ट्रिगर को अपेक्षित के रूप में निष्पादित किया जाता है।

मुझे संदेह है कि डीबीआईएक्स :: कक्षा मूल्य को इस तरह से स्थापित कर रही है जो ट्रिगर को फायरिंग से रोकती है।

दुर्भाग्यवश, मुझे मूस के साथ डीबीआईएक्स :: कक्षा का उपयोग करने के बारे में संसाधनों को खोजने में बहुत भाग्य नहीं मिला है। मैंने जो लिखा है वह ज्यादातर DBIx::Class and 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'); 
+1

ऐसा लगता है कि डीबीआईसी की ऑटो-जनरेटेड विधियां मूस के ऑटो-जनरेटेड विधियों को ओवरराइट कर रही हैं। मूस का बिंदु इसे रोकने के लिए है, लेकिन यह ऐसा नहीं कर सकता है जब कुछ मूस का उपयोग नहीं करता है। शायद आप बस "चारों ओर" संशोधक चाहते हैं। – jrockway

उत्तर

-3

आप की कोशिश की है writer => \&_mod_isin बजाय का उपयोग कर?

+0

उम्मीद है कि नहीं, क्योंकि तब कार्यक्रम संकलन समय पर मर जाएगा। – jrockway

2

सबसे पहले, आपको मूस के भीतर से गैर-मूस वर्ग को विस्तारित करने की समस्या है। यह एक समस्या है क्योंकि डीबीआईएक्स :: कक्षा मूस :: ऑब्जेक्ट से प्राप्त नहीं होती है, इसलिए आपको मानक मूस विधियों जैसे does नहीं मिलेगा। इस समस्या को हल करने के लिए Moose::Cookbook::Basics::Recipe11 देखें।

दूसरा, आपको बड़ी समस्या है कि आपके पास जादू के दो अलग-अलग सेट हैं जो आपके लिए सबराउटिन बनाने की कोशिश कर रहे हैं। आपके पास मूस है, जिसका जादू isin और sid सबराउटिन बनाता है, और आपके पास डीबीआईएक्स :: कक्षा है, जिसका जादू isin और sid सबराउटिन बनाता है जो मूस के निर्माण वाले लोगों को प्रतिस्थापित करता है।

आप around संशोधक के साथ एक मूस रोल में लिखना चाहेंगे, जैसा कि जॉकवे ने सुझाव दिया था।