Data::Modelでは、現段階ではリレーションをサポートしていません。作者の大沢さん(id:yappo)ご自身の紹介には「よい実装手法があれば作りたい所」とも書かれているので、将来的な実装を期待するところ極めて大なのですが、現段階でサポートしていないのも納得のいく話です。
なぜなら、Data::Modelはobject/relation mapperではなく、data/object mapperだから......というのも勿論ですが、O/Rマッパーを使う上では、あまりリレーションにこだわらず、リレーションが必要になる処理は予め非同期に済ませておくのが、世の趨勢である(ように見受けられる)からです。『モダンPerl入門』にも、以下のような箴言が書かれています。
そのような複雑な処理が必要なのであれば、それらは非同期に前もって行い、サマリーテーブルを作成するべきでしょう
とはいえ、先の画面遷移図を見ると、Amikeco::Entity::Avatar(プレイヤーキャラクター)とAmikeco::Entity::Race(種族)のようなhas-a関係だけでなく、Amikeco::Entity::Account(アカウント)とAmikeco::Entity::Expansion(拡張パッケージ)やアカウントとプレイヤーキャラクターのようなhas-many関係が頻出しています。
まさにこれを単純化して、リレーションを廃したサマリーテーブルを触らなければならないのでしょうが、取り敢えず最初はリレーションを無理矢理実装しています。もうちょっと一般化が済んだら泥臭いコードを公開しますが、そもそもData::Model::Rowオブジェクトにadd_methodすればいいのに、わざわざ別個のMyApp::Entity::Foobarオブジェクトを作っているので、スタート地点から使い方を間違えているような気がなきにしもあらずです。というような状況で、Data::Modelのトランザクションと、MyApp::Entity::Foobar(Moose/Mouseオブジェクト)のlazy_buildでせこせこと実装しています。
コメントする