もちろん設定など何も書かずに単純にエイリアスとしても使えるんですが、あまり意味がありません。
一番美味しい使い方としては、オリジナルカラムには Inflate の設定を行わずにオリジナルのまま利用できるようにしつつ、エイリアスカラム側に Inflate の設定をして、オリジナルのデータと Inflate のデータを両方扱えるようにするといった事をする時です。
さて実際に、定義してみましょう。先日からいじっている bookmark テーブルの create_at カラムに対してこの美味しいエイリアスを仕込みます。
# create_at を生の値でも使いたい
column create_at => int => {
required => 1,
unsigned => 1,
default => sub { time() },
};
# Inflate するのはエイリアスで
alias_column create_at => create_dt => {
inflate => 'DateTime',
};
単純に create_at の定義から Inflate の設定を抜いて alias_column で create_dt というエイリアスカラムを張って、そこのカラムに DateTime の Inflate 定義を設定しています。
さて、先日までのサンプルスクリプトを create_dt に対応させて利用例を見てみましょう。
$bookmark->set( bookmark => [1, 1] );
my $row = $bookmark->lookup( bookmark => [1, 1] );
print "--- insert\n";
print $row->create_at . "\n";
print $row->create_dt . "\n";
my $dt = DateTime->new( year => 1978, month => 3, day => 20 );
$row->create_dt( $dt );
print "--- update 1978/3/20\n";
print $row->create_at . "\n";
print $row->create_dt . "\n";
$row->update;
my $row2 = $bookmark->lookup( bookmark => [1, 1] );
print "--- lookup 1978/3/20\n";
print $row2->create_at . "\n";
print $row2->create_dt . "\n";
$row2->create_at( 0 );
print "--- update 0\n";
print $row2->create_at . "\n";
print $row2->create_dt . "\n";
$row2->update;
my $row3 = $bookmark->lookup( bookmark => [1, 1] );
print "--- lookup 0\n";
print $row3->create_at . "\n";
print $row3->create_dt . "\n";
結果は以下のとおりです。
--- insert 1260772604 2009-12-14T06:36:44 --- update 1978/3/20 259200000 1978-03-20T00:00:00 --- lookup 1978/3/20 259200000 1978-03-20T00:00:00 --- update 0 0 1970-01-01T00:00:00 --- lookup 0 0 1970-01-01T00:00:00
create_at, create_dt メソッドそれぞれに値を入れたら即座にお互いの値も変更されてるのがわかると思います。
先日 DateTime の deflate 定義として数値と DateTime オブジェクト両方受け入れられるようにした時に epoch time を直接いれてしまうと、それいこう DateTime オブジェクトで取得出来ない問題がありましたが、エイリアスカラムを使うと常に値が入れられたタイミングで同期されるので安心です。
数日連続して Inflate 関連の話題を書きました。
alias_column は、元データと加工後のデータがそれぞれ必要なときに便利です。
ということで次回はまた別のジャンルのネタにしようとおもいます。