カテゴリー
technology

DBIx::MoCoと戯れる

最近仕事で DBIx::MoCo を使ってる。実装が軽いのとリストメソッドチェーンが気持ち良くて、データベーステーブルありきの実装の際は一番簡単にO/Rマッパを実装できるんじゃないかな。
ところが、はまった箇所があったので、忘れないようメモ。


retrieve_or_create メソッドは以下のように説明があるけど

Retrieves a object or creates new record with given data and returns that.

普通にwhere句を渡すと問題がある。条件をいくら渡してもプライマリーキーに関連する条件しか加味しないようになっているじゃないか。(5行目)

sub retrieve_or_create {
my $class = shift;
my %args = @_;
my %keys;
@keys{@{$class->primary_keys}} = @args{@{$class->primary_keys}};
$class->retrieve(%keys) || $class->create(%args);
}

キャッシュするときのキーを正規化するため?DBIx::Class と同じ雰囲気で利用しているとはまるだろう。
とはいえ、どんな場面でもいきなり MyApp::Schema::Foo->search(%opt) のように簡単にアクセスできるのは非常に楽。Perl界のはやりとしては Moose にスポットがあたってるが、MoCoもなかなかどうしていいんじゃないかしら。