MySQL、オープンソース系、ウェブ系ネタ。DBIx::Class(DBIC)に入門。使い始めてDBICの作法に翻弄されてる。timestamp的なカラム、例えばupdated_atカラムを自動更新させるのにハマったのでメモ。$self->next::method(@_);}1;上記のようなResultクラスのベースを継承してResultクラスを作っていくのだけど、ちょっとした問題に当たる。データを更新するには下記のようになる。});いずれのコードもis_publicカラムを1に更新する。updated_atカラムが現在の時刻に自動更新される...と思うのだけどそうならない場合がある。更新されるのはfind()を使っているその1の場合だけ。その2の場合は更新されない。この理由と対処方法は下記エントリーに書かれている。DBIx::Class(DBIC)で既存のメソッドを上書きしたい。使われるupdateメソッドは別のものって事。いうのを見つけたけど、こちらもfind()のようにrowオブジェクト取得してからupdateしないと効かないようだ...。単純に発行されるSQLが少ないから。keyが分かってて、かつ、その行のデータの取得は必要がない場面を想定している。場合はSELECT文が発行されず、UPDATE文のみが発行されるようだったので。通常はいきなりUPDATEを行うことは少ないかもしれない。解決策としてはfind()で更新するって方法とResultクラスではなくResultsetクラスのベースになるものにしてあげるって方法があると思う。find()で解決した場合の問題点find()を使う場合は必ずSELECTが発行される。先程の例で言うと発行されるSQLのイメージは下記のような感じ。xxx;必要がないSELECT文が実行されるのは避けたい。ResultSetクラスでの解決Resultクラスの共有部分を作るように、ResultSetクラスの共有で解決できそうだと思って試したら出来た。$self->next::method(@_);}1;このResultクラスを継承して各テーブルのResultクラスを作る。エントリーの例で言うと下記コードのような感じ。ここにテーブル定義1;もうちょっとスマートな方法があったら後で加筆する。[...]Mojoliciousでactionの前後に実行される独自のHookを作る。PerlのWebApplicationFrameworkであるMojoliciousでは様々なフックが用意されているのだけれど、actionの前後だけに実行したい場合は独自にフックポイントを追加しないといけない。単純な実装方法はaround_actionフックを使うのが良さそう。教えてもらって、便利だったのでPerlでも同じようなことが出来ないかググったら出来るみたい。UriMojoliciousでactionの前後に実行される独自のHookを作る。before_action、after_action編Gunma.web#27は4月29日だって!コメントする返信をキャンセルする。DBIx::Class(DBIC)でtimestamp的なカラムの自動更新Mojoliciousでactionの前後に実行される独自のHookを作る。