DBICのオレオレResultSetを作ったんだけど
ResultSetにメソッドを生やしたい訳です。ResultSourceのメソッドにresolve_prefetchっていうのがあって、prefetchとかjoinで指定するrelationのリファレンスを渡すとcolumnを返してくれるものがあります、{ blogs => 'user_id' }みたいなやつです。ただしそのままではlookupに使えないのと自分が無いのでちょっとWrapしたい訳です。
巷ではResultSetManager使うらしいんですが、Loader使ってるので使えません。で、自分のResultSetを作って
my $source = $schema->resultset('Moge')->result_source; $source->resultset_class('MyApp::ResultSet');
みたいな感じでresultset_classを指定して自分の好きなことする訳です。
で、その指定する方法なんですけどどこに置いたらいいのかわからない。
とりあえず最初は
package MyApp::Schema; use strict; use base qw/DBIx::Class::Schema::Loader/; __PACKAGE__->loader_options( relationships => 1, ); __PACKAGE__->connection('dbi:mysql:test', agile => 'pass'); for my $moniker ( __PACKAGE__->sources ) { my $class = __PACKAGE__->class($moniker); $class->resultset_class('MyApp::ResultSet'); }
みたいにSchemaにconnect_info書くと言う何とも気持ち悪い方法で。
ふとdmakiさんのページを見て奇麗にしようと思ってこうしたわけです。
package MyApp::Schema; use strict; use base qw(DBIx::Class::Schema::Loader); __PACKAGE__->loader_options( relationships => 1, ); sub connection { my $class = shift; my $schema = $class->SUPER::connection(@_); for my $moniker ( $schema->sources ) { my $class = __PACKAGE__->class($moniker); $class->resultset_class('MyApp::ResultSet'); } $schema; }
とりあえずこれで普通には動くんですけど、result_source_instanceつかって自分のビューを作ったクラスだとうまく行かない!一個前のやつだと自分のビューもオレオレResultSetも動くんですけど、、
http://www.removabletype.net/pods/DBIx/Class/Manual/Cookbook.html#arbitrary_sql_through_a_custom_resultsource
これですね。select * from table tblのtbl部分にSQLを書いて自分のSQLにする。
で、なんだかんだ悩んでたんですけど、結局は
#自分の生やしたいメソッド sub DBIx::Class::ResultSet::test { warn "Hello!" }
結局これをSchemaに書いておけばいいんではないかと言う結論に。なんか納得いかないけどとりあえずこれでいいか。いいのかなぁ。
というか自分のビュー作るコードはどこ置けばいいんだろう。Schemaはstaticに書き出した方がいいのかなぁ。