Как использовать add_to в Class::DBI?

Я пытаюсь использовать Class::DBI с простым родителем -> может отношения детей:

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, но не могу понять, что я делаю неправильно.

3 ответа

Решение

Я согласен с Манни, если ваши декларации пакетов находятся в том же файле, то вам нужно иметь класс с has_a() отношения определены в первую очередь. В противном случае, если они находятся в разных исходных файлах, то в документации говорится:

Class::DBI обычно должен уметь делать правильные вещи, если все классы наследуют Class::DBI до "использования" любых других классов.

Что касается формы с тремя аргументами, вы делаете это правильно. Третий аргумент за has_many() столбец во внешнем классе, который является внешним ключом для этого класса. То есть, Offer имеет CompanyId что указывает на Company"s CompanyId,

Спасибо

Ну, на самом деле проблема была не в моем коде, а в моей настройке. Я понял это сегодня утром после включения моего компьютера: * Apache + mod_perl на сервере * SMB mount

Когда я внес изменения в несколько файлов, mod_perl, похоже, загружает не все изменения. Перезапуск Apache решает проблему. Я действительно видел подобную проблему в прошлом, когда время клиента и сервера SMB не синхронизировано.

Приведенный выше код отлично работает с 1 файлом для каждого модуля.

Спасибо

У меня действительно нет большого опыта работы с Class:DBI, но я все равно попробую:

  1. В документации говорится: "класс с has_a() должен быть определен раньше, чем класс с has_many()".
  2. Я не могу найти никаких ссылок на то, как вы используете has_a и has_many с тремя аргументами, что всегда является "CompanyId" в вашем случае.
Другие вопросы по тегам