DBIx::Class(DBIC)で既存のメソッドを上書きしたい。おしゃれCTO手帖Webアプリを開発する上でのTipsや苦労話などなど。2011年1月13日木曜日DBIx::Class(DBIC)で既存のメソッドを上書きしたい。自分の開発しているWebアプリケーションは、DBIx::Class(DBIC)を使っているのですが、少しハマったので、調査したことを書きます。自動的にmemcachedに保存されているキャッシュを削除させたかったのです。することで、キャッシュの削除を透過的に行うことができて、嬉しいかなと思いました。そこで、該当テーブルのupdateメソッドを上書きすることにしました。);$self->delete_cache();}1;こんな感じでupdateメソッドを上書きしておけば、UPDATEのタイミングでdelete_cache()も実行されるハズと思っていたのですが、上手くいかない場合がありました。#上書きしたメソッドが実行されない上記のテストスクリプトを実行すると、findメソッドなどで取得した単一レコードに対してupdateを実行すると、上書きしたupdateメソッドが実行されるのですが、searchメソッドなどで取得した複数行のレコードに対してupdateメソッドを発行した場合、上書きしたupdateメソッド(DBIC::DB1::Result::Table内のupdateメソッド)が呼ばれていないことがわかりました。そこで、findおよびsearchメソッドが返すオブジェクトを調べてみることにしました。その結果、findが返すのは、DBIC::DB1::Result::Tableオブジェクト、一方、searchが返すのは、DBIx::Class::ResultSetでした。様々なレシピというページが見つかったので、ここを参考にして次のようなパッケージを新しく作成しました。);$self->delete_cache();}1;そして先ほどのテストスクリプトを実行すると。出来た!うまくいきました。単一レコード(Result)に対するupdateメソッドと複数レコード(ResultSet)に対するupdateメソッドは、それぞれ別に定義してあげないといけなかったのでした。対して、以下のコードを追加するよう書かれていますが、これはなくてもOKでした。DBIC::DB1において、__PACKAGE__->load_namespaces;しているからでした。以下に配置したパッケージが自動的に認識されるみたいです。以下参考にしたURLです。(Atom)自己紹介YTWeb系の会社でCTOをやっています。バックグラウンドはどちらかというとエンタープライズ寄り。同じIT業界ですが、Webの世界はわからない事だらけです。日々ですが、楽しくやってます。Storable)DBIx::Class(DBIC)で既存のメソッドを上書きしたい。