1

http://wiki.class-dbi.com/wiki/Overriding_autogenerated_accessorsの例に従いました

データベースに挿入する前に URL を変更したい:

package Hosting::Company;
use base 'Class::DBI';

 my $class = __PACKAGE__;

$class->table('Companies');
$class->columns(Primary => 'CompanyId');
$class->columns(Others => qw/Name Url Comment/);

sub Url {
my $self = shift;

    # modify URL.
    if (@_) {
        $_[0] = 'aaaaaaaaaaaa';
        # return $self->_Url_accessor('aaaaaaaaaaaa'); - doesn't work either
    }

    # Back to normal Class::DBI 
    return $self->_Url_accessor(@_);
}

しかし、うまくいきません:

my $company = Hosting::Company->insert({ Name => 'Test', Url => 'http://http://url' });
print $company->Url, "\n";

ショー:

http://http://url

Class:DBI メーリングリストがまだ生きていたらいいのに!

4

2 に答える 2

3

URL アクセサーで、パラメーターがそのメソッドに渡されたかどうかを確認します。しかし、何も渡していないので、アクセサーは _Url_accessor() を呼び出すだけです。おそらく、最初に _Url_accessor を呼び出してから、結果を変更する必要があります。

sub Url {
    my $self = shift;

    # Was there a param passed in?
    if ( @_ ) {
         # Do you really want to modify it here?
         return $self->_Url_accessor(@_);
    }
    else {
        my $url = $self->_Url_accessor();
        # mangle result here:
        $url = 'aaaaaaaaa';
        return $url;
     }
}

データベースに入る前に URL を変更したい場合は、クラスに normalize_column_values を指定する必要があると思います。これは、挿入が行われるたびに呼び出されます。

于 2009-01-31T09:31:38.057 に答える
1

アクセサーをオーバーライドしても変更されませんinsert。データの正規化を処理する最善の方法は、オーバーライドすることnormalize_column_values()です。しかし、Manni の言うとおりです。あなたのアクセサーは逮捕されました。

PS CDBI メーリング リストはまだアクティブですが、投稿があまり見られません。ほとんどがDBIx::Classに移行しました。

于 2009-01-31T09:35:52.290 に答える