tôi đang cố gắng để thực hiện các tình huống sau với DBIx: DBIx và thừa kế trong Perl
Bảng
sản phẩm chứa "sản phẩm chung" và "sản phẩm bó" (bó sản phẩm này là bộ sưu tập các sản phẩm nói chung):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,
});
Như bạn có thể thấy, thời tiết các sản phẩm là một vị tướng sản phẩm hoặc một sản phẩm bó được lưu trong cột loại.
Bây giờ tôi muốn để đóng gói thông tin này trong bản sắc lớp: Tôi muốn có các lớp sau:
- Sản phẩm (
type
không quan trọng) - BundleProduct (
type
= 'bó') - GeneralProduct (
type
= 'chung')
tôi đã viết:
012.package BundleProduct;
use base 'Product';
__PACKAGE__->resultset_attributes({ where => { 'type' => 'bundle' } });
1;
và
package GeneralProduct;
use base 'Product';
__PACKAGE__->resultset_attributes({ where => { 'type' => 'general' } });
1;
Nhưng khi thực hiện
my @allProducts = $schema->resultset('BundleProduct')->all;
tất cả sản phẩm chung được lấy. Mặc dù các đối tượng kết quả là ví dụ BundleProduct
, SQL được tạo ra chứa điều kiện WHERE của lớp GeneralProduct
(type
= 'chung'). Thậm chí tệ hơn: Nếu tôi cố gắng lấy một số Product
(lớp cơ sở là BundleProduct
và GeneralProduct
), điều kiện type
= 'chung' cũng được áp dụng! Dường như định nghĩa trong phạm vi GeneralProduct
sẽ ghi đè tất cả các định nghĩa khác.
Điều gì sai với thiết kế của tôi?
@dreagtun Cảm ơn bạn, nhưng tôi nghĩ rằng InflateColumn :: Object :: Enum chỉ được chỉ định để chuyển đổi trường 'varchar' thành trường' enum' trong ứng dụng. [link] (http://search.cpan.org/~jmmills/DBIx-Class-InflateColumn-Object-Enum-0.04/lib/DBIx/Class/InflateColumn/Object/Enum.pm) –
Nhìn vào các bài kiểm tra được cung cấp bởi mô đun 'DBIx :: Class :: InflateColumn :: Object :: Enum', tác giả luôn tải thành phần và đặt' is_enum => 1'. Đây là bài kiểm tra phù hợp với những gì bạn đang cố gắng làm trong ví dụ của bạn: https://metacpan.org/source/JMMILLS/DBIx-Class-InflateColumn-Object-Enum-0.04/t/lib/TestDB/NativeEnumNoneNullable.pm Tác giả có lẽ quá nhiệt tình nhưng có lẽ đáng để thử. Ngoài ra tác giả không cung cấp các thử nghiệm 'default_value' để có thể có vấn đề ở đó? Dù sao tôi đã cập nhật câu trả lời của tôi cho phù hợp. – draegtun