/ / डीबीआईएक्स :: क्लास टेबल्स - पर्ल, डीबीक्स-क्लास में "नई" विधि को ओवरराइड कैसे करें

डीबीआईएक्स :: क्लास टेबल्स - पर्ल, डीबीक्स-क्लास में "नई" विधि को ओवरराइड कैसे करें

मैंने यहां पढ़ा है http://search.cpan.org/~frew/DBIx-Class-0.08200/lib/DBIx/Class/Manual/Cookbook.pod#Setting_default_values_for_a_row कि कॉलम के लिए डिफ़ॉल्ट मान सेट करने का एक तरीका ओवरराइड करना था नया तरीका।

मेरी समस्या यह है कि मेरी नई विधि कभी नहीं कहा जाता है।

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;

और मुझे $ उपयोगकर्ता ऑब्जेक्ट पूरी तरह से निर्मित और परिचालन मिलता है, जिसका अर्थ है कि मेरी ब्रांड नई विधि कभी नहीं कहा जाता है। क्यों नहीं ???

मैंने इसे चारों ओर स्थानांतरित करने की कोशिश की है लेकिन बिना किसी सफलता के ...

उत्तर:

जवाब के लिए 2 № 1

मैं आपको डेटाबेस में मानों से एक परिणाम / पंक्ति वस्तु का निर्माण करने के लिए कॉल करता हूं। कुकबुक में वर्णित मामला नई पंक्ति वस्तुओं को बनाने के लिए है उदा। $ rs-> बनाना कॉल करके।

आप डेटाबेस से आने वाले मूल्यों को ओवरराइड क्यों करना चाहते हैं?

ध्यान दें कि आप एक के लिए डिफ़ॉल्ट मान भी सेट कर सकते हैं"default_value" विशेषता के साथ कॉलम। यदि आप new_result के साथ एक पंक्ति ऑब्जेक्ट बनाते हैं तो यह कॉलम मान सेट नहीं करता है, लेकिन यदि आप $ scma-> तैनाती के साथ अपना डेटाबेस तैनात करते हैं तो डेटाबेस डिफ़ॉल्ट कॉलम मान सेट करें।

यदि आप एक नई पंक्ति वस्तु के लिए मान सेट करना चाहते हैं तो एक नज़र डालें DBIx :: कक्षा :: DynamicDefault.


जवाब के लिए 0 № 2

मुझे अंततः समाधान मिला: डेटाबेस / स्टोरेज से पंक्ति वस्तुओं के त्वरण को नियंत्रित करने के लिए, आपको ओवरराइड करने की आवश्यकता है inflate_default तरीका।

डॉक्टर से:

सभी डीबीआईएक्स :: कक्षा :: परिणामसेट विधियां जो डेटा से पुनर्प्राप्त करती हैं डेटाबेस और इसे पंक्ति वस्तुओं में बदल दें इस विधि को कॉल करें (* Inflate_default *)।

इस प्रक्रिया में हुक करने के लिए अपने परिणाम वर्गों में इस विधि को विस्तारित करें, उदाहरण के लिए एक अलग वर्ग में परिणाम को बेकार करने के लिए।

बेशक अगर आपको नई विधि से पंक्ति वस्तुओं के त्वरण को नियंत्रित करने की आवश्यकता है, तो आपको इसे ओवरराइड करना होगा।

संक्षेप में, यदि आप पंक्ति वस्तुओं के हर संभावित तत्कालता पर हुक करना चाहते हैं, तो आपको दोनों को ओवरराइड करना होगा inflate_result तथा नया.