Drkcore

29 01 2007 Catalyst DBIC Tweet

DBICでprefetchとjoin

ありがたい。色々勉強になりました。

Hatena::Diary::Neko::kak 500 Internal Server Error - CatはしらんけどSledgeなら

基本コントローラーでRSを作りまくってstashにぶち込みまくって Viewの方で実際にクエリを実行する感じですね。

というわけでcookbookみながら悩んでみた。いじってるのは、こんな感じのテーブルなので、

多対多対多

user_bookmarksテーブルに対してイテレータをまわすことにした。 あとcatlystだとautoっていう最初(のほうに)に呼ばれるメソッドがあるので、そこにユーザーが存在するかどうかのバリデーション書いた。

sub auto : Private {
    my ($self, $c, $action, $username) = @_;

    $c->stash->{user} = 
      $c->model('PblDB::User')->single({name => $username});

    unless (defined($c->stash->{user}) || $c->req->path =~ m!^bookmarks/?$!) {
    $c->response->redirect($c->uri_for('/'));
    return 0;
    }

    return 1;
}

sub default : Private {
    my ( $self, $c ) = @_;

    $c->stash->{user_bookmark_it} = 
    $c->model('PblDB::UserBookmark')->search(
          {user_id => $c->stash->{user}->id},
          {       
             prefetch => [qw/user bookmark/],
             join => [qw/user bookmark/],
             order_by => 'me.id DESC'
           }
           );
}

あと、ユーザーバリデーションしてる件に関しては、

livedoor クリップ - Hatena::Diary::Neko::kak 500 Internal Server Error - CatはしらんけどSledgeなら

個人的には、バリデーションでユーザがいるかどうかはチェックしないなー。 そこでユーザの存在がわかっちゃうとあれかなと。まぁ、場合によるね。

とか

ってやった場合に、ユーザがいない場合にそんなメソッドがないよってエラーになっちゃうので、バリデーションしたというのが経緯なのだが、join使えば、

sub default : Private {
    my ( $self, $c, $action, $username ) = @_;

    $c->model('PblDB::UserBookmark')->search(
          {'user.name' => $username},
          {
             prefetch => [qw/user bookmark/],
             join => [qw/user bookmark/],
             order_by => 'me.id DESC'
          }
          );
}

と書けばよいのでこれでもいいかもしれんと思った。

あと、実際のサービスでそういった場合の処理はどうしてんのかなと気になったので僕が使っているSBSで調べてみた。

  • はてなブックマーク
  • トップページに飛ばされる
  • livedoor clip
  • unregistration.html
  • del.icio.us
  • エラーページ

ふむー。

About

  • もう5年目(wishlistありマス♡)
  • 最近はPythonとDeepLearning
  • 日本酒自粛中
  • ドラムンベースからミニマルまで
  • ポケモンGOゆるめ

Tag

Python Deep Learning javascript chemoinformatics Emacs sake and more...

Ad

© kzfm 2003-2021