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好きになってきた。