Wan*_*ang 5 perl catalyst dbix-class
我正在开发一个将在运行时生成数据库表的应用程序.我正在使用Catalyst和DBIC,我需要在生成新表时生成新的ResultSet.这个新的ResultSet必须作为Catalyst模型添加,所以我可以,$c->model('DB::NewFoo')但我需要在运行时发生这种情况.
表生成和ResultSet生成不是问题,我需要的是在运行时将那些新生成的ResultSet添加到Model中,以便我可以在进一步的请求中调用它们.
到目前为止,我的想法是创建一个控制DBI::Class::Schema,提供访问器方法的类,并提供一种在运行时更新和重新加载Schema的方法.我想要一个使用Catalyst本身的不同想法.
感谢您提供的所有帮助.
这并不完美,但它对我们有用。
如果您重载文件中的模型方法,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);
}
}
Run Code Online (Sandbox Code Playgroud)
然后将类似的内容放入您的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);
}
Run Code Online (Sandbox Code Playgroud)
要点是,现在如果您请求未加载的结果集,它将在运行时从其他名称空间加载(因为您可能仍希望在编译时加载许多其他结果。)
多年来我们一直在使用它来生成数百个表,并且效果很好。