DBIx::Class::AsFdatのvalueがundefなのを表示したくない

DBIx::Class + Catalyst::View::JSON(2) - ヒルズで働く@robarioの技ログを使ってDBICのハンドルをJSON化だやったーなんて言っていて、その後DBIx::Class::AsFdatを知ってちょっと感動したりしたんですけど、as_fdat()で戻って来た値で、selectしていない値がundefで入っててイヤンな感じなのでそれをなんとかした?のをちょっと書いた。DBのcolumnがmogeとhogeって言うのがあったとしてselect moge from tableってやると、{moge=>'value', hoge => undef}みたいな感じになってしまうのを{moge => 'value'}みたいにしたい。

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

our $VERSION = 0.01; 

sub as_fdat {
    my $self = shift;
    my $data = $self->{_column_data};
    my $ret;

    for my $col (keys %$data)   {
        $ret->{$col} = $self->$col;
    }

    return $ret;
}

1;

ほぼそのままですがな。


スキーマに問い合わせて、全てのcolumnをforで回してるのでundefが入る模様なので、selectされた項目だけを取り出してやろうと思ったけどdumpしたらそのままな内部データがあったのであとはdeflateした。書きながら思ったけどこれrelationあったら動かないんじゃね?とか、remove_columnでcolumn消せば良いんじゃね、とか、もしかしてDBICCatalystにこんな機能あるんじゃね?思ったけどそれはそのとき考える。