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++