カラムにエイリアスを張るB!

はじめに

さて、先日までは Inflate の使い方を見てきました。

まだ utf8_column の話しはしてませんが後回しにして、 Inflate と一緒に使うと便利なエイリアスカラムの機能を紹介します。

    alias_column original_name => alias_name => { ... };

のように使います。

第一引数がエイリアス元となるカラムの名前。

第二引数がエイリアスしたカラムの名前。

第三引数が設定です。

もちろん設定など何も書かずに単純にエイリアスとしても使えるんですが、あまり意味がありません。

一番美味しい使い方としては、オリジナルカラムには 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 は、元データと加工後のデータがそれぞれ必要なときに便利です。

ということで次回はまた別のジャンルのネタにしようとおもいます。