【问题标题】:Catalyst & Perl - Generate models in runtimeCatalyst & Perl - 在运行时生成模型
【发布时间】:2014-04-28 00:19:01
【问题描述】:

我正在开发一个将在运行时生成数据库表的应用程序。我将 Catalyst 与 DBIC 一起使用,我需要在生成新表时生成新的 ResultSet。必须将这个新的 ResultSet 添加为 Catalyst 模型,这样我才能$c->model('DB::NewFoo'),但我需要在运行时进行。

表生成和结果集生成不是问题,我需要在运行时将那些新生成的结果集添加到模型中,以便在进一步的请求中调用它们。

到目前为止,我的想法是创建一个控制DBI::Class::Schema 的类,提供访问器方法并提供一种在运行时更新和重新加载架构的方法。我想要一个使用 Catalyst 本身的不同想法。

感谢您提供的所有帮助。

【问题讨论】:

    标签: perl catalyst dbix-class


    【解决方案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);
     }
    

    要点是,现在如果您请求一个未加载的结果集,它会在运行时从其他命名空间加载(因为您可能仍希望在编译时加载许多其他结果。)

    多年来,我们一直在为一组数百个生成的表使用它,并且效果很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-30
      • 2015-08-16
      • 1970-01-01
      • 1970-01-01
      • 2010-10-29
      • 1970-01-01
      相关资源
      最近更新 更多