Динамическое добавление столбцов в DBIx :: Class ResultSet - PullRequest
3 голосов
/ 03 декабря 2010

У меня есть DBIx::Class объект, представляющий аукцион eBay.Базовая таблица имеет столбец описания, который содержит много данных.Столбец описания почти никогда не используется, поэтому он не включен в список столбцов DBIx::Class для этой таблицы.Таким образом, большинство запросов не получают данные описания аукциона.

У меня, однако, есть один скрипт, которому нужен этот столбец.В этом случае я хочу получить доступ к содержимому столбца описания, как и к любому другому столбцу:

$auction->description

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

1 Ответ

3 голосов
/ 03 декабря 2010

В более старых версиях DBIx::Class (не уверен в номере версии) работало следующее:

my $rs = $schema->resultset('Auctions');
my $lots = $rs->search(
   undef,
   { '+select' => 'description', '+as' => 'description' },
);

Это не работает для обновлений строк в современных версиях DBIx::Class.Попытка сделать это с обновлением

$auction->update({ description => '...'})

в DBIx::Class 0.08123 приводит к следующей ошибке: «DBIx :: Class :: Relationship :: CascadeActions :: update (): нет описания такого столбца в ...»

Предполагается, что сценарий, которому требуется дополнительный столбец, выполняется в своем собственном процессе.Вы можете сделать что-то вроде этого:

my $rs = $schema->resultset('Auctions');
$rs->result_source->add_columns('description');
YourApp::Schema::Lots->add_columns('description');
YourApp::Schema::Lots->register_column('description');

Конечно, это глобальное изменение.После добавления столбца другой код в том же процессе начнет извлекать столбец description в запросах.Не говоря уже о том, что это некрасиво.

...