- 2008年5月16日 03:43
- 仕事のこと
例えばこんな 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 とタッグを組まれるとさらに不安です。
- Newer: 今更なことをいくつか
- Older: 僕とじゃんけんしないか(存在しないクラスを use base する)
Comments:0
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 日々のこと