Data::Modelでのリレーション(1)で、Data::Modelに大きくて重い皮を被せたので自縄自縛に陥ってしまったと書きました。一方でArkサンプルアプリケーション「SimpleLinks」では、規模がFF14総合ウェブアプリケーション「Amikeco」とは段違いに小さいこともあって、比較的見通しがよいスキーマが書けたように思います。Data::Modelサンプルアプリケーションとしてもご覧いただけるかも知れません。
例えばmany_to_manyを例に取ると、websiteが所属するcategoryの一覧は$website_row->categoriesで得られますし、その反対も$category_row->websitesで得られます。使う場合にのみリレーションを取り扱うので、不必要に遅くなることもありません。
ただ、つまるところは手動でやっている作業をスキーマに押し込めただけなので、きちんとしたリレーションになっているわけではありません。実際には$model->set(website => { ... });などと生で触ることをせず、mix-inしたクラスか、より好ましくは呼び出し元であるAPIクラス(SimpleLinks::Service::Links)でadd_websiteという皮を用意して、リンクエンティティ(website_categoryなど)を同時にupdateするということになりそうです。
やろうと思えば何とかhas_a, has_one, might_have, has_many, many_to_manyなどのリレーションを使えるので、リレーションが現段階でサポートされていないからといってData::Modelを使わないという食わず嫌いは勿体ないと思います。
なお、add_method関数がcallerを使ってメソッドを生やす先の行オブジェクトを探しているので、モデルがadd_methodの一大巨編になりがちなのが少し気に掛かります。最近とみにそのカオス具合が増している画面遷移図もどき(カオスっぷりを笑うために、第3弾を近々上げておきます)ほどの規模になると、流石に1スキーマクラスで何でもやろうとすると見通しが悪くなりかねないと思うのです。
......というようなことをサンプルアプリシリーズとは別個にエントリを立てて述べるのは、ひとえにシリーズの中に占めるModelネタが大きくなり過ぎて右往左往していることに他なりません。以上、見通しの甘さに定評のあるgardejoの提供でお送りしました。
最近のコメント