とっても便利なDBIx::Class::InflateColumn::DateTimeですが、前にも書いたとおり作成日時、更新日時などの設定が面倒です。

LyoさんのDBIx::Class::DateTimeColumnsはその辺がRails likeになっていてお気に入りだったので取り込んで見ました。

package DBIx::Class::InflateColumn::DateTime::Auto;

use strict;
use warnings;

our $VERSION = '0.01';

use base qw/DBIx::Class::InflateColumn::DateTime/;

use DateTime;

__PACKAGE__->mk_classdata( datetime_timezone => 'local' );
__PACKAGE__->mk_classdata( _auto_create_datetime_columns =>
        [ qw/created_on created_at/ ] );
__PACKAGE__->mk_classdata( _auto_update_datetime_columns =>
        [qw/updated_on updated_at/] );

sub auto_create_datetime_columns {
    my $self = shift;
    for (@_) {
        $self->throw_exception("column $_ doesn't exist")
            unless $self->has_column($_);
    }
    $self->_auto_create_datetime_columns( \@_ ) if @_;
    $self->_auto_create_datetime_columns;
}

sub auto_update_datetime_columns {
    my $self = shift;
    for (@_) {
        $self->throw_exception("column $_ doesn't exist")
            unless $self->has_column($_);
    }
    $self->_auto_update_datetime_columns( \@_ )
        if @_;
    $self->_auto_update_datetime_columns;
}

sub new {
    my ( $self, $attrs ) = @_;

    my $now = $self->get_current_datetime;
    for my $column (
        @{ $self->auto_create_datetime_columns },
        @{ $self->auto_update_datetime_columns }
        )
    {
        if (   $self->has_column($column)
            && $self->column_info($column)->{_inflate_info}
            && !defined( $attrs->{$column} ) )
        {
            $attrs->{$column} = $now;
        }
    }
    $self->next::method( $attrs, @_ );
}

sub update {
    my ( $self, $attrs ) = @_;

    my $now = $self->get_current_datetime;
    for my $column ( @{ $self->auto_update_datetime_columns } ) {
        if (   $self->has_column($column)
            && $self->column_info($column)->{_inflate_info}
            && !defined( $attrs->{$column} ) )
        {
            $attrs->{$column} = $now;
            $self->{_dirty_columns}{$column} = 1;
        }
    }
    $self->next::method( $attrs, @_ );
}

sub get_current_datetime {
    my $self = shift;
    return DateTime->now( time_zone => $self->datetime_timezone );
}

1;

っていうかそのままです。
ゴメンナサイ

使い方はこんな感じ。InflateColumn::DateTime::Autoをロードするだけ。かなり楽チン。

package Album;

use strict;
use warnings;

use base qw/DBIx::Class/;

__PACKAGE__->load_components(qw/PK::Auto InflateColumn::DateTime::Auto Core/);
__PACKAGE__->table('albums');
__PACKAGE__->add_columns(
    qw/id title artist/,
    created_on => {data_type => 'datetime'},
    modified_on => {data_type => 'datetime'}
);
 __PACKAGE__->set_primary_key('id');

1;
              

              

トラックバック(0)

トラックバックURL: http://mt.hide-k.net/mt-tb.cgi/500

コメントする

プロフィール

このブログ記事について

このページは、hideが2006年8月 2日 00:20に書いたブログ記事です。

ひとつ前のブログ記事は「バルセロナ100周年記念ユニフォーム」です。

次のブログ記事は「DBIx::ClassでFULLTEXT searchしてみる」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。