Ich versuche zur Zeit das folgende Szenario mit DBIx zu implementieren:DBIx und Vererbung in Perl
Die Tabelle Produkte „allgemeine Produkte“ und „Bundle-Produkte“ enthalten (Bündelprodukte Sammlungen von allgemeinen Produkten sind):
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,
});
Wie Sie sehen können, ob das Produkt ein allgemeinen Produkt oder ein Bündel Produkt wird in der Spalte Typ gespeichert.
Nun möchte ich gerne diese Informationen in der Klassenidentität kapseln: Ich möchte folgende Klassen haben:
- Produkt (
type
spielt keine Rolle) - BundleProduct (
type
= 'Bündel') - GeneralProduct (
type
= 'General')
ich schrieb:
package BundleProduct;
use base 'Product';
__PACKAGE__->resultset_attributes({ where => { 'type' => 'bundle' } });
1;
und
package GeneralProduct;
use base 'Product';
__PACKAGE__->resultset_attributes({ where => { 'type' => 'general' } });
1;
Aber wenn
my @allProducts = $schema->resultset('BundleProduct')->all;
alle allgemeinen Produkte sind Ausführung geholt. Obwohl die resultierenden Objekte der Instanz BundleProduct
sind, enthält das generierte SQL die WHERE-Bedingung der Klasse GeneralProduct
(type
= 'allgemein'). Noch schlimmer: Wenn ich versuche, eine Product
(Basisklasse BundleProduct
und GeneralProduct
) zu holen, wird auch die Bedingung type
= 'allgemein' angewendet! Es scheint, dass die Definition innerhalb GeneralProduct
alle anderen Definitionen überschreibt.
Was stimmt nicht mit meinem Design?
@dreagtun Danke, aber ich denke, dass InflateColumn :: Object :: Enum nur für die Umwandlung von 'varchar'-Felder in' enum' Felder innerhalb der Anwendung bestimmt ist. [link] (http://search.cpan.org/~jmmills/DBIx-Class-InflateColumn-Object-Enum-0.04/lib/DBIx/Class/InflateColumn/Object/Enum.pm) –
Blick auf die bereitgestellten Tests Beim 'DBIx :: Class :: InflateColumn :: Object :: Enum'-Modul lädt der Autor immer die Komponente und setzt auch' is_enum => 1'. Hier ist der Test, der zu dem passt, was Sie in Ihrem Beispiel versuchen: https://metacpan.org/source/JMMILLS/DBIx-Class-InflateColumn-Object-Enum-0.04/t/lib/TestDB/NativeEnumNoneNullable.pm Der Autor vielleicht übereifrig, aber vielleicht einen Versuch wert. Auch der Autor bietet keine 'default_value'-Tests, so dass es dort ein Problem geben könnte? Jedenfalls habe ich meine Antwort entsprechend aktualisiert. – draegtun