1

ここでhttp://search.cpan.org/~frew/DBIx-Class-0.08200/lib/DBIx/Class/Manual/Cookbook.pod#Setting_default_values_for_a_rowを読みましたが、列のデフォルト値を設定する方法は新しい方法。

私の問題は、新しいメソッドが呼び出されないことです。

ユーザー.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;

そして、$user オブジェクトを完全に構築して操作できるようにします。つまり、まったく新しいメソッドが呼び出されることはありません。 なぜだめですか ???

私はそれを動かそうとしましたが、成功しませんでした...

4

2 に答える 2

2

データベース内の値から Result/Row オブジェクトが構築されていることがわかります。クックブックで説明されているケースは、たとえば $rs->create を呼び出して新しい行オブジェクトを作成する場合です。

データベースから取得した値をオーバーライドする必要があるのはなぜですか?

「default_value」属性を使用して列のデフォルト値を設定することもできます。これは、new_result で行オブジェクトを構築する場合は列の値を設定しませんが、$schema->deploy でデータベースをデプロイする場合はデータベースのデフォルトの列値を設定します。

新しい行オブジェクトの値を設定したい場合は、DBIx::Class::DynamicDefaultを見てください。

于 2012-09-04T17:27:32.827 に答える
0

最終的に解決策を見つけました。データベース/ストレージからの行オブジェクトのインスタンス化を制御するには、inflate_defaultメソッドをオーバーライドする必要があります。

ドキュメントから:

データベースからデータを取得して行オブジェクトに変換するすべての DBIx::Class::ResultSet メソッドは、このメソッドを呼び出します (*inflate_default*)。

Result クラスでこのメソッドを拡張して、このプロセスにフックします。たとえば、結果を別のクラスに再ブレスします。

もちろん、新しいメソッドによって行オブジェクトのインスタンス化を制御する必要がある場合は、それをオーバーライドする必要があります。

要約すると、行オブジェクトの可能なすべてのインスタンス化をフックしたい場合は、inflate_resultnewの両方をオーバーライドする必要があります。

于 2012-09-12T16:55:19.017 に答える