Catalyst и Perl - создание моделей во время выполнения

Я работаю над приложением, которое будет генерировать таблицы базы данных во время выполнения. Я использую Catalyst с DBIC, и мне нужно, чтобы при создании новой таблицы создавался новый ResultSet. Этот новый ResultSet должен быть добавлен как модель Catalyst, чтобы я мог $c->model('DB::NewFoo'), но мне нужно, чтобы это происходило во время выполнения.

Создание таблицы и создание ResultSet не является проблемой, мне нужно добавить во время выполнения эти недавно сгенерированные ResultSet в модель, чтобы я мог вызывать их в дальнейших запросах.

Пока что моя идея состоит в том, чтобы создать класс, который управляет DBI::Class::Schema, предоставляет методы доступа и предоставляет метод для обновления и перезагрузки схемы во время выполнения. Я бы хотел другую идею, которая использует сам Catalyst.

Спасибо за помощь, которую вы можете оказать.


person Wang    schedule 20.03.2014    source источник


Ответы (1)


Это не идеально, но у нас это сработало.

Если вы перегрузите метод модели внутри своего MyApp.pm файла, чтобы он выглядел примерно так:

 sub model {
    my ($self, $model, @rest) = @_;

    if (my ($rs) = $model =~ m/^DB::(.+)$/) {
       $self->model('DB')->schema->resultset($rs)
    } else {
       return $self->next::method($model, @rest);
    }
 }

а затем введите что-то вроде этого в свой Schema.pm:

 use List::Util 'first';
 sub resultset {
    my ($self, $rs) = @_;
    unless (first { $_ eq $rs } $self->sources) {
       eval "require MyApp::Schema::NonDefaultResult::$rs";
       $self->register_class("$rs", "MyApp::Schema::NonDefaultResult::$rs");
    }
    return $self->next::method($rs);
 }

Суть в том, что теперь, если вы запрашиваете не загруженный набор результатов, он загружается во время выполнения из некоторого другого пространства имен (так как вы можете по-прежнему загружать многие другие результаты во время компиляции).

Мы использовали это в течение многих лет для набора сотен сгенерированных таблиц, и это хорошо сработало.

person Frew Schmidt    schedule 08.04.2014