カラムの定義を使いまわす2
はじめに
昨日は 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 との連携について書きます。