$shibayu36->blog;

クラスター株式会社のソフトウェアエンジニアです。エンジニアリングや読書などについて書いています。

DBIx::DataFactoryでデータ作成メソッドを指定する

 昔実装してみたけれど、ブログに書いてなかったので書きます。

 以前、ORMを使ってる時にDBIx::DataFactoryを使うとtriggerとかの関係で面倒って言われたので、その解決策として、データ作成メソッドをcoderefで指定できるようにしてみました。

 creatorとしてcoderefを指定すると、そのcodeにDBIx::DataFactoryで作成された値がhashrefで渡されるので、それを使ってinsertを行うって感じです。また、その時にreturnした値が、実際に作成されたメソッドを使ったときに返ってきます。

 具体的には

$factory_maker->create_factory_method(
    method          => 'create_factory_data',
    table           => 'test_factory',
    creator => sub {
        my ($values) = @_;

        my $db = DBIx::Simple->connect(
            'dbi:mysql:test_factory', 'root', '',
        ); # your setting
        $db->abstract = SQL::Abstract->new;

        my $result = $db->insert('test_factory', $values);
        return $result;  # this is used for return value of create_factory_data
    },
);

と書くと、DBIx::Simpleのinsertがデータ作成として使われ、create_factory_dataの返り値として$resultの値が返ってきます。

 このやり方が良いかどうかは微妙なので、意見もらえると嬉しいです。