とっても便利な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;

コメントする