inflate_columnとget_columnと_column_data[DBIC]

取得したデータを参照するときに変換しておきたい場合はinflate_columnを使います。

例えばcreated_onカラムをDateTimeオブジェクトとして扱いたい場合、

package Schema::Foo;
__PACKAGE__->inflate_column(
  'created_on',
  {
    inflate => sub { DateTime::Format::xxx->parse_datetime(shift);  },
  }
);

なんて設定をしておくと、$row->created_on はDateTimeオブジェクトになるわけです。
この時 $row->get_column('created_on') とすることで生の文字列を得ることもできます。


また、inflate_columnを使う代わりに get_column を上書きしてしまうこともできます。

package Schema::Foo;
sub get_column {
    my ( $self, $column ) = @_;

    my $value = $self->next::method($column);
    if ( $column eq 'created_on' ) {
        $value = DateTime::Format::xxx->parse_datetime($value);
    }

    return $value;
}

なんて書いておくと、今度は $row->created_on も $row->get_column('created_on') もどちらもDateTimeオブジェクトになります。
まぁget_columnの上書きでこんな使い方はあまりしないと思いますけど、inflate_columnとは違って別のカラムのデータを使ってごにょごにょしたりとか色々できます。


例えば(あくまでも例なので無理やりですが)「何か秘密のデータを別カラムのデータとくっつけてハッシュ化して出す」なんて処理は、

sub get_column {
    my ( $self, $column ) = @_;

    my $value = $self->next::method($column);
    if ( $column eq 'secret_data' ) {
        $value = Digest::SHA::sha1_hex($value . $self->next::method('another_column_data'));
    }

    return $value;
}

なんていう風に書けます。



ところで、get_columnを上書きしても結局 $row->{_column_data}->{secret_data} で生の文字列を得ることができますので、本当に見られたくないものに対してはこんなことしても無駄ですよ。