User:Bookmarkみたいな1対多(多対多でもいいけど)なテーブルをDBICでいじるとする。
DBICをスクリプトなんかでいじくるときには、Perl/DBIC - Nekokak's core dump
な感じでいいんだけど、、、、
CatalystでDBIC+TTを使う場合に、どこまでコントローラーで処理すればいいのか分からなくて悩んでる。
http://localhost:3000/bookmark/kzfm
みたいに、ユーザーのブックマークを表示したいときに
sub test1 : Private {
my ($self, $c, $user) = @_;
my $uid = $c->model('PblDB::User')
->find({empnum => $user})->id;
my $b =
[$c->model('PblDB::UserBookmark')->search(user_id => $uid)];
my @bookmarks = map $_->bookmark_id, @$b;
$c->stash->{bookmarks} =
[$c->model('PblDB::Bookmark')->search(id => \@bookmarks)];
$c->stash->{template} = 'bookmarks/list.tt2';
}
これはイマイチというか駄目やろ(何のためにDBICのリレーション設定したのかわからんようになる) というのは分かるんだけど、下のやり方もなんか変。
sub test2 : Local {
my ($self, $c, $user) = @_;
$c->stash->{user} = $c->model('PblDB::User')
->find({empnum => $user});
$c->stash->{template} = 'bookmarks/test.tt2';
}
で、テンプレートのほうは、user受け取ってbookmarkを取り出すと。
[% FOREACH bookmark = user.bookmarks -%]
<ul>
<li>[% bookmark.id %]</li>
<li>[% bookmark.title %]</li>
</ul>
[% END -%]
とかやると、処理がコントローラーとテンプレートにまたがっちゃうし、ページの処理とか面倒になっちゃう。
DBICのオブジェクトは渡さずに、コントローラー内で全部処理してハッシュをTTに被せるだけにするのがいいのかなぁ。
ウーム悩ましい(僕だけ?)
07.01.18 追記
コメント見て、なるほどと思ったのでこうしてみた。そのうちイテレータにする。
defined($user) ? #
$c->stash->{bookmarks} = [$c->model('PblDB::User') #
->find($user->id)->bookmarks] : # user exist
$c->response->redirect('/bookmark/') ; # or not
ユーザーがいない場合には、インデックスにリダイレクトするようにした。
07.01.22 追記
モデルでやるべし。というコメントを見て、ふむー、ResultSetってそのためにあんのかとか思った。開放された気分。DBIC好きになってきた。