DBICでcreate_relatedをoverrideする

Posted on 11月 26, 2009
Filed Under perl |

DBICを使っています。
User has_many Histories
っていう関係のテーブルUserとHistoryがあった時に、
Userの行それぞれに対して、最新のHistoryをUserの行の中にキャッシュしておくと便利なときがあります。
そんな時に、$user->add_to_histories ってやった時に $userもupdateしたい、という話です。

PERL:
  1. CREATE TABLE user (id unsigned not null auto_increment, **中略**, history unsigned not null);
  2. CREATE TABLE history (id unsigned not null auto_increment, user unsigned not null, **中略**, created_date datetime not null);

UserのRowクラスは

PERL:
  1. package Schema::Row::User;
  2. 中略
  3. __PACKAGE__->has_many( histories => 'Schema::Row::History', 'user' );

HistoryのRowクラスは

PERL:
  1. package Schema::Row::History;
  2. 中略
  3. __PACKAGE__->belongs_to( user => 'Schema::Row::User' );

UserのRowクラスに追加されるadd_to_$relを使って

PERL:
  1. $user->add_to_histories({ action => 'marriage' });

とかってやるわけです。

HistoryのRowを追加する時にcreated_dateを意識せずに設定したいときとかに、
HistoryのRowクラスに↓って書いておきます

PERL:
  1. sub insert {
  2.     my $self = shift;
  3.     $self->created_date( DateTime->now ) unless $self->created_date;
  4.     $self->next::method(@_);
  5.     return $self;
  6. }

これはよくやるんですが、同じタイミングでUserの方もupdateしたいって時に、

UserのRowクラスに、

PERL:
  1. sub create_related {
  2.     my $self = shift;
  3.     my ($rel, $col_data) = @_;
  4.     my $ret = $self->next::method(@_);
  5.     if ( $rel eq 'histories' ) {
  6.         $self->update({ history => $ret->id }); # とか、$col_data->{action} とか
  7.     }
  8.     return $ret;
  9. }

って書いておくと、便利だわー

typester++

Comments

Leave a Reply