DBIx::Class::Schema::Loaderのクラスをカスタマイズする

人のデータを表すテーブルがあるとする。

CREATE TABLE person (
    id integer PRIMARY KEY,
    first_name text,
    last_name text
);

first_nameとlast_nameをつなげた full_name という仮想的な列があると便利。

package TestDB;
use base qw/DBIx::Class::Schema::Loader/;

__PACKAGE__->loader_options();

1;
package main;

my $db_schema = TestDB->connect("dbi:Pg:dbname=testdb2","","",undef);
my $row = $db_schema->resultset('Person')->first;

print $row->full_name, "\n";

@INC に設定してあるディレクトリの下に、ディレクトリとDIBx::Class::Schema::Loaderで生成されるクラスをカスタマイズするためのファイルをつくる。

mkdir TestDB
vi TestDB/Person.pm

Person.pmの中身。full_nameメソッドが追加されている。

package TestDB::Person;
sub full_name
{
    my $self = shift;
    return $self->first_name . " " . $self->last_name;
}
1;

「仮想的な列」なので、first_nameだけを取得してしまうとやっぱりfirst_nameの分しか表示されない。

my $row2 = $db_schema->resultset('Person')->search(undef,
    { columns => ['first_name'] }
    )->first;
print $row->full_name, "\n";