Getting ActiveRecord-like ‘created_at’ behaviour with Perl’s Class::DBI

I really like ActiveRecord and on a recent project I wanted to be able to create fields in my database called ‘created_at’ and have them automatically filled with the current date at time of insert just as ActiveRecord does. Unfortunatly I was forced to use Perl’s Class::DBI* so I came up a simple method of creating the same behaviour.

First, create a parent class that all of your Class::DBI table classes will inherit from:

package DB::DBI;
use base 'Class::DBI';
use POSIX qw(strftime);

#Your connection string will vary:

# Automatically add timestamp to 'created_at' fields.
__PACKAGE__->add_trigger(before_create => sub {
my $self = shift;
$self->can('created_at') and $self->set('created_at', strftime("%Y-%m-%d %H:%M:%S", localtime));

Now create a class for each of your tables inheriting from the parent class:

package DB::MyTable;
# Inherit from DB::DBI
use base 'DB::DBI';

__PACKAGE__->columns(All => qw/id field1 field2 field3 created_at/);

And now when you do a DB::MyTable->create({...}) your created_at field will be automatically populated with the current timestamp. Yay!

* And no, I wasn’t allowed to use DBIx::Class.

One thought on “Getting ActiveRecord-like ‘created_at’ behaviour with Perl’s Class::DBI

  1. Carl says:

    “Unfortunatly I was forced” – you make it sound like you don’t like working here :-)

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s