DBIx::Class::Schema::Loader と DBIx::Class::InflateColumn::URI

例えばこんな MyApp::Schema の場合。

package MyApp::Schema;

use strict;
use warnings;
use base 'DBIx::Class::Schema::Loader';

__PACKAGE__->loader_options(
    relationships => 1,
    components    => [ qw/
        ResultSetManager
        InflateColumn::DateTime
        InflateColumn::URI
        Core
    / ],
);

1;
my $blog = $schema->resultset('Blog')->find( $id );
$blog->url;

これで URI オブジェクトが返ってきてほしい。
InflateColumn::URI はまさにそれをやってくれるコンポーネントなんですが、inflate, deflate の設定が

package MyApp::Schema::Blog;

use strict;
use warnings;
use base 'DBIx::Class';

# 中略

__PACKAGE__add_columns( qw/
    ...
    'created_on', { data_type => 'datetime', ... },
    'url', { data_type => 'varchar', is_uri => 1, ... },
    ...
/ );

みたいに、is_uri => 1 とすることになっている。
上記のMyApp::Schema のように __PACKAGE__->load_classes をしなかった場合、 url は inflate も deflate もされない。
InflateColumn::URI::register_column で

return unless defined $info->{'is_uri'};

なんてしているから。
DB をスキャンして is_uri なんていう情報は取れないからね。__PACKAGE__->load_classes 前提の実装になっているみたい。POD にそう書いているわけではないのではまった。

一方、created_on は InflateColumn::DateTime で inflate, deflate されます。それは InflateColulmn::DateTime::register_column で

return unless defined($info->{data_type});
my $type = lc($info->{data_type});
$type = 'datetime' if ($type =~ /^timestamp/);
...
if ($type eq 'datetime' || $type eq 'date') {
    # 以下 inflate, deflate の処理の設定

カラムの型が DATETIME, TIMESTAMP, DATE であった場合は inflate, deflate の設定をする実装になっているから。これは DB をスキャンしても __PACKAGE__->load_classes でも取れるもんね。

要は、DBIx::Class::Schema::Slave のデバッグをしていて InflateColumn::URI で inflate, deflate されないバグに出くわしたけど、これって InflateColumn::URI がそういう実装になっているから仕方のないことじゃんってことです。僕は悪くなかったんだって言いたいだけです。

ところで、DBIx::Class::Schema::Loader base の MyApp::Schema を使っていて、かつ __PACKAGE__->load_classes していない人ってどれくらいいるのでしょうね?DBIx::Class::Schema::Slave にとって __PACKAGE__->load_classes なしの DBIx::Class::Schema::Loader って鬼門なんですよね。ResultSetManager とタッグを組まれるとさらに不安です。

Comments:0

Comment Form

Trackbacks:0

TrackBack URL for this entry
http://hibinokoto.jp/mt/mt-tb.cgi/270
Listed below are links to weblogs that reference
DBIx::Class::Schema::Loader と DBIx::Class::InflateColumn::URI from 日々のこと

Home > 仕事のこと > DBIx::Class::Schema::Loader と DBIx::Class::InflateColumn::URI

Search
Feeds

Return to page top