2015-05-03 8 views
1

Я довольно новичок в Perl и получил этот проект Catalyst для поддержки. Существует база данных MySQL, которая подключается через DBIx, и мне нужно сделать некоторые изменения. В документации проекта я нашел, как создается модель:Perl/DBIx :: Class :: Schema :: Суффикеры загрузчика _2 для дублирования имени отношения

dev:~# script/prj_create.pl 
model PrjDB DBIC::Schema 
prj::Schema::PrjDB 
create=static 
preserve_case=1 
moniker_map='sub {return $_[0];}' 
col_accessor_map='sub {return $_[0];}' 
inflect_plural='sub {return $_[0];}' 
inflect_singular='sub {return $_[0];}' 
exclude='^view_' 
components=TimeStamp,PassphraseColumn,DynamicDefault 
use_moose=1 
dbi:mysql:prj root ******** 

В базе данных есть отношения, как

company_user belongs_to company (foreign key) 
company_user has_many company_user ("last_changed_by_user") 
company_user has_many company (secondary relationship via "last_changed_by_user") 

Оригинальная модель, которую я получил имеет следующие строки, созданные в «company_user. вечера ":

__PACKAGE__->has_many(
    "company", 
    "prj::Schema::PrjDB::Result::company", 
    { "foreign.last_changed_by" => "self.id" }, 
    { cascade_copy => 0, cascade_delete => 0 }, 
); 

__PACKAGE__->belongs_to(
    "company", 
    "prj::Schema::PrjDB::Result::company", 
    { id => "company" }, 
    { is_deferrable => 1, on_delete => "CASCADE", on_update => "CASCADE" }, 
); 

Если теперь я пытаюсь воссоздать модель я получаю:

__PACKAGE__->has_many(
    "company", 
    "prj::Schema::PrjDB::Result::company", 
    { "foreign.last_changed_by" => "self.id" }, 
    { cascade_copy => 0, cascade_delete => 0 }, 
); 

__PACKAGE__->belongs_to(
    "company_2", 
    "prj::Schema::PrjDB::Result::company", 
    { id => "company" }, 
    { is_deferrable => 1, on_delete => "CASCADE", on_update => "CASCADE" }, 
); 

(Обратите внимание на «_2» суффикс в пакете belongs_to.)

С помощью этой модели, все существующие код брейки, поскольку он не может найти некоторые методы больше. Я откровенно не знаю, что искать, поэтому я надеялся, что кто-то здесь может мне помочь.

Есть ли какой-либо вариант в загрузчике, который мне нужно установить/отключить, или это может быть что-то, что даже не нужно делать с загрузчиком?


Edit: Единственное, что я нашел для {отн} _2 обозначения до сих пор находится в ResultSet class, где он говорит:

Если же присоединиться поставляется в два раза, это будет совмещенным to {rel} _2 (и аналогично в третий раз).

Я не знаю, если это источник моей проблемы и как ее обойти.

Одна вещь, которой у меня не было в моем первоначальном вопросе: рабочая модель была создана с версией DBIx 2012 года («Я думаю, не документирована»), и теперь я использую новейшую доступную.

ответ

1

Я собираюсь предположить, что вторая строка в этом ваша проблема:

company_user belongs_to company (foreign key) 
company_user has_many company_user ("last_changed_by_user") 
company_user has_many company (secondary relationship via "last_changed_by_user") 

Ваша пользовательская таблица имеет foereign ключ relatioship к себе, так что с момента его has_many realtionship с собой называется company, то belongs_to Недвижимость называется company_2.

Я предполагаю, что предыдущая версия сделала что-то подобное, но программист отредактировал сгенерированные файлы, чтобы изменить company_2 на что-то другое.

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

Но почему вы регенерируете материал DBIC, а не редактируете его? Разве он не взял на себя ответственность за контроль источника?

+0

Спасибо за ответ. То, что отношение has_many к себе может быть проблемой, - это то, что я тоже.Загрузчик не обнаружил ошибок, когда попытался перезаписать оригинальную schmema, поэтому я предполагал, что программист не отредактировал сгенерированный код (если бы он был, проверка контрольной суммы не сработала ?!). Я думал, что регенерация - это путь к обновлению, а не редактированию. Контроль источника не включен (пока). Для обновления схемы я попытаюсь теперь ознакомиться с DBIx :: Class :: DeploymentHandler, так как мне кажется, что мне все равно нужно идти глубже. –

+0

Проверьте свою базу кода в исходном коде, прежде чем вносить какие-либо изменения. –