現在、DBIx を使用して次のシナリオを実装しようとしています。
テーブル製品には、「一般的な製品」と「バンドル製品」が含まれています (バンドル製品は一般的な製品のコレクションです)。
package Product;
use base 'DBIx::Class::Core';
__PACKAGE__->table("products");
__PACKAGE__->add_columns(
"productId",
{ data_type => "varchar", is_nullable => 0, size => 10},
"name",
{ data_type => "varchar", is_nullable => 1, size => 150},
"type",
{
data_type => "enum",
default_value => "general",
extra => {
list => ["general", "bundle"],
},
is_nullable => 0,
});
ご覧のとおり、商品が一般商品なのか、バンドル商品なのかが、列タイプに保存されます。
ここで、この情報をクラス ID にカプセル化したいと思います。次のクラスが必要です。
- 商品(
type
問いません) - BundleProduct (
type
= 'バンドル') - GeneralProduct (
type
= '一般')
私が書いた:
package BundleProduct;
use base 'Product';
__PACKAGE__->resultset_attributes({ where => { 'type' => 'bundle' } });
1;
と
package GeneralProduct;
use base 'Product';
__PACKAGE__->resultset_attributes({ where => { 'type' => 'general' } });
1;
しかし、実行すると
my @allProducts = $schema->resultset('BundleProduct')->all;
すべての一般的な製品がフェッチされます。結果のオブジェクトは instance のものですがBundleProduct
、生成された SQL にはクラスの WHERE 条件GeneralProduct
( type
= 'general') が含まれています。さらに悪いことに、( andProduct
の基本クラス)を取得しようとすると、条件= '一般' も適用されます! 内の定義が他のすべての定義を上書きしているようです。BundleProduct
GeneralProduct
type
GeneralProduct
私のデザインのどこが悪いのですか?