gpt4 book ai didi

perl - Catalyst & Perl - 在运行时生成模型

转载 作者:行者123 更新时间:2023-12-04 21:16:24 25 4
gpt4 key购买 nike

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

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

到目前为止,我的想法是创建一个类来控制 DBI::Class::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);
}
}

然后把这样的东西放在你的 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);
}

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

我们多年来一直将它用于一组数百个生成的表,并且运行良好。

关于perl - Catalyst & Perl - 在运行时生成模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22545085/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com