maaash.jp

what I create

DBICでcreate_relatedをoverrideする

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

1
2
CREATE TABLE user (id unsigned not null auto_increment, \*\*中略\*\*, history unsigned not null);
CREATE TABLE history (id unsigned not null auto\_increment, user unsigned not null, \*\*中略\*\*, created\_date datetime not null);

UserのRowクラスは

1
2
3
package Schema::Row::User;
中略
\_\_PACKAGE\_\_->has_many( histories => ‘Schema::Row::History’, ‘user’ );  

HistoryのRowクラスは

1
2
3
package Schema::Row::History;
中略
\_\_PACKAGE\_\_->belongs_to( user => ‘Schema::Row::User’ );  

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

1
$user->add\_to\_histories({ action => ‘marriage’ });  

とかってやるわけです。

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

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

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

UserのRowクラスに、

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

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

typester++

Comments