今度はDBICでUser->find_by('age', 1)とかUser->find_all_by('user_id', 1)とかやってみた

DBICでUser->find_by_id(1)とかやってみたのブランチだか改良みたいな。

after

# 検索結果は1件
my $user_a = User->find(3);                  # select 〜 where user.id = 3
my $user_b = User->find_by('age', 3);        # select 〜 where user.age = 3
# 検索結果はn件
my $books = Book->find_all_by('user_id', 4); # select 〜 where book.user_id = 4

反省点

  • そもそもsearch->nextってfindと等価じゃないの
  • 1件しかデータ取れないじゃん
  • やっぱり色んなカラムで検索したい

道家に相談

  • 方向性は違えど、とうの昔に似たようなことをやっていた。
    • メソッド名ではなく、引数に着目

やってみよう・リベンジ

use String::CamelCase 'decamelize';

sub setup {
    my $c = shift;

    $c->NEXT::setup(@_);

    foreach my $F (@schemas) {
        my $f = decamelize $F; # Hoge -> hoge, HogeHuga -> hoge_huga

        no strict 'refs';
        *{$F} = sub { $c->model("DBIC::$F") };
        *{"MyApp::ResultSet::$F\::find_by"} = sub {
            my ($self, $column, $value) = @_;
            $self->search({"$f.$column" => $value})->next;
        };
        *{"MyApp::ResultSet::$F\::find_all_by"} = sub {
            my ($self, $column, $value) = @_;
            $self->search({"$f.$column" => $value});
        };
    }
}

改善した点

↑の反省点をひっくり返そう

駄目な点

  • != 3とかの検索ができません
  • like検索もできません
    • find_like_by、find_all_like_by、find_not_by、とか作ればいいけど、名前センスねぇー


Sub::AutoでDBICにfindByほげほげを生やしてみた - Lism.in * blog - nekoya (id:studio-m)
氏がやろうとしてることの代理にゃならんですかね。
あとご迷惑だったらすいません。

それでは今回も

道家さん毎度毎度ありがとうございます。