カラムの定義を使いまわす2B!

はじめに

昨日は dann さんによる Memcached Protocol 向けのドライバの紹介を書いていただきました。 dann++

さて今日は一昨日の続きとして Column Sugar の続きを紹介しようと思います。

カラム定義を再利用可能に

前回のカラム定義では、特定のスキーマ定義クラスの中で定義されてしまうので、他のクラスから使いたい時には使えません。

例えば MyDiary.pm の中に以下のような定義を行うと

column_sugar 'diary.id'
    => int => {
        required => 1,
        unsigned => 1,
    };

install_model diary => schema {
    key 'id';
    index user => [qw/ user_id id /];

    column 'diary.id';
    column 'user.id';
};

下記のようなエラーが発生して実行が停止しています。

$ perl -MMyDiary
Undefined column of 'user.id' at example/MyDiary.pm line 27

これは use MyBookmark してしまえば、 MyBookmark.pm の中で定義されている user.id が利用出来るのですが、もし MyBookmark で定義したテーブルを使わない時は無駄になってしまいます。

そういう時はカラム定義を外出ししてあげて、他のクラスからも再利用可能にしてあげる事ができます。

例えば Columns.pm といった形で以下のようにコードを書きます。

package Columns;
use strict;
use warnings;
use Data::Model::Schema sugar => 'mycolumns';

column_sugar 'user.id'
    => int => {
        required => 1,
        unsigned => 1,
    };

column_sugar 'diary.id'
    => int => {
        required => 1,
        unsigned => 1,
    };

column_sugar 'global.epoch'
    => int => {
        required => 1,
        unsigned => 1,
    };

1;

MyBookmark.pm と MyDiary.pm で定義したものを全部こっちに移動しました。

use Data::Model::Schema する時に sugar => sugar_name というオプションを与えてるのがポイントです。

このオプションを与える事で、複数の column_sygar 定義での定義名の衝突が防げるようになります。

デフォルトの sugar name としては default がしようされています。

sugar name をデフォルトから変更したので MyBookmark.pm と MyDiary.pm の use Data::Model::Schema に対してもオプションを変えてあげる必要があります。

package MyBookmark;
use strict;
use warnings;
use base 'Data::Model';
use Data::Model::Schema sugar => 'mycolumns';
use Data::Model::Mixin modules => ['+MyBookmark::Mixin::Count', 'FindOrCreate'];
use Columns;
package MyDiary;
use strict;
use warnings;
use base 'Data::Model';
use Data::Model::Schema sugar => 'mycolumns';
use Columns;

column sugar 定義クラスで mycolumns として定義したので、これを使う側のスキーマ定義クラスでも mycolumns をしていします。

またちゃんと use Columns; として Columns.pm をロードしておく事も重要です。

まとめ

本日は、ある程度の規模の時に便利になってくる Column Sugar のライブラリ化についての紹介を行いました。

明日は Column Sugar の最後のトピックの Column Alias との連携について書きます。