3

Class::DBI を単純な 1 つの親で使用しようとしています -> may chidren の関係:

Data::Company->table('Companies');
Data::Company->columns(All => qw/CompanyId Name Url/);
Data::Company->has_many(offers => 'Data::Offer'=>'CompanyId'); # =>'CompanyId'

Data::Offer->table('Offers');
Data::Offer->columns(All => qw/OfferId CompanyId MonthlyPrice/);
Data::Offer->has_a(company => 'Data::Company'=>'CompanyId');

新しいレコードを追加しようとしています:

my $company = Data::Company->insert({ Name => 'Test', Url => 'http://url' });
my $offer = $company->add_to_offers({  MonthlyPrice => 100 });

しかし、私は得る:

Can't locate object method "add_to_offers" via package "Data::Company"

クラシック Music::CD の例を見ましたが、何が間違っているのかわかりません。

4

3 に答える 3

4

パッケージ宣言が同じファイルにある場合は、has_a()最初に定義された関係を持つクラスが必要です。それ以外の場合、それらが異なるソース ファイルにある場合、ドキュメントには次のように記載されています。

Class::DBI は通常、他のクラスを「使用」する前にすべてのクラスが Class::DBI を継承する限り、正しいことを行うことができるはずです。

3 引数形式に関しては、適切に実行しています。の 3 番目の引数has_many()は、このクラスの外部キーである外部クラスの列です。つまりOffer、 のCompanyIdを指す がありCompanyますCompanyId

于 2009-01-30T12:31:44.683 に答える
2

ありがとうございました

さて、問題は実際には私のコードではなく、私のセットアップでした。今朝、コンピューターの電源を入れた後、次のことに気づきました。*サーバー上のApache +mod_perl*SMBマウント

複数のファイルに変更を加えたとき、すべての変更がmod_perlによってロードされるわけではないようです。Apacheを再起動すると、問題が解決します。私は過去に、クライアントとSMBサーバーの時刻が同期していないこの種の問題を実際に見ました。

上記のコードは、モジュールごとに1つのファイルで正常に機能します。

ありがとうございました

于 2009-01-30T18:03:33.903 に答える
1

Class:DBIの経験はあまりありませんが、とにかくこれを試してみます。

  1. ドキュメントには、「has_a()を使用するクラスは、has_many()を使用するクラスよりも前に定義する必要があります」と記載されています。
  2. has_aとhas_manyを、あなたの場合は常に「CompanyId」である3つの引数で使用している方法への参照が見つかりません。
于 2009-01-30T10:48:36.950 に答える