DBIC によるモデル

DBIx::Class::Schema で作ったクラスは,そのまま直でインスタンスを生成することができます。

use My::Schema::TestTable;

my $o = My::Schema::TestTable->new;
$o->field1('value1');

これを後付で DB に挿入するスマートな方法がわかりません。

my $db = My::Schema->connect('dbi:...');
$o->result_source($db->result_set('TestTable')->result_source);
$o->insert;

のように無理矢理やれば一応うまくはいきます。でもどうみてもスマートじゃないですよね。

ウェブアプリケーションを作っていると,たとえばフォームで入力している間はセッションにモデルのインスタンスを保持しておいて,最終的に登録した段階で DB に入力したいというケースがよくあります。そのような時に DB と接続したり切断したり(独立したり)というのが柔軟なモジュールはないのかなぁというのが最近の悩みです。DBIx::Class も dirty フラグをもってたりしてなかなか高度なんですが,belongs_to や has_many を使うとどうしても DB に接続しないとうまくいかなかったりするんです。

アプリ上のモデルはモデル,DB 上の O/R マッピングモデルはまた別のモデル,というふうにきっぱりわけるべきなんでしょうね。