Как использовать add_to в Class :: DBI? - PullRequest
3 голосов
/ 30 января 2009

Я пытаюсь использовать 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"

Я посмотрел пример классической музыки :: CD, но не могу понять, что я делаю неправильно.

Ответы [ 3 ]

4 голосов
/ 30 января 2009

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

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

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

2 голосов
/ 30 января 2009

Спасибо

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

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

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

Спасибо

1 голос
/ 30 января 2009

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

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