Perl with Catalyst和DBIx :: Class - 如何在继承树中加载一组类?

时间:2013-06-21 15:54:56

标签: perl inheritance catalyst dbix-class

我想有一个基类Vehicle和我的大多数系统只使用这种类型的ARRAY。使用Carty,Airplane等子类型。当调用canFly等方法时,Car会响应false,而Airplane会响应true。

我计划使用单个数据库表(将侦听其他建议),其中子类型列指示实际子类类型和其他同级子类使用的列的NULL值。我如何在DB查询中拦截Vehicle类的创建,而不是给定(subclasstype)创建适当的子类? (如果这个问题不明确,我将在周六晚上(从现在起约28小时)尝试澄清。)

2 个答案:

答案 0 :(得分:3)

你在寻找什么在DBIx :: Class中被称为Dynamic Subclassing。在Rails / ActiveRecord中,他们称之为单表继承(STI)。

我链接到的页面DBIC Cookbook描述了如何覆盖inflate_result,以便您可以测试行的车辆类型,然后将其重新放入所需的子类中。

答案 1 :(得分:1)

传统的构造函数如下所示:

package MyObject;
sub new {
    my ($package, @args) = @_;
    my $self = { };
    ... use @args, initialize $self ...
    return bless $self, $package;    # or sometimes  bless $self,__PACKAGE__
}

bless语句为$self中的数据结构分配“类型”。通常,bless的第二个参数是当前包的名称。但这是Perl,所以你并不总是以通常的方式做事。即使在MyObject的构造函数中,您也不必将MyObject传递给bless

package MyObject;
sub new {
    my ($package, %args) = @_;
    my $self = { };
    ... use @args, initialize $self ...
    if ($args{"type"} == 1)    { $package = "MyObject::Foo"; }
    elsif ($args{"type"} == 2) { $package = "MyObject::Bar"; }
    elsif ($args{"type"} == 3) { ... }
    return bless $self, $package;
}