今度は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)
氏がやろうとしてることの代理にゃならんですかね。
あとご迷惑だったらすいません。
それでは今回も
柔道家さん毎度毎度ありがとうございます。