Für jede gegebene Ergebnisklasse MYSCHEMA :: Ergebnis :: Foo (aus Standardschema Loader gebaut erzeugt Syntax, die Moose/MooseX verwendet :: nonmoose)Moose Methode Modifikatoren auf DBIx :: Class :: Schema Modelle in Katalysator
Wenn ich eine BUILDARGS Methode Wrapper hinzufügen, wie so die Konstruktor Daten für eine Zeile zu sanieren:
package MySchema::Result::Foo;
use Moose;
use MooseX::NonMoose;
[etc ..]
around 'BUILDARGS' => sub {
my $orig = shift;
my $class = shift;
delete $_[0]->{not_a_real_column};
return $class->$orig(@_);
};
Es funktioniert, wenn das Schema direkt verwenden. Zum Beispiel können die folgenden Arbeiten wie erwartet: Eine neue Zeile Objekt mit real_column => ‚Wert‘ erstellt und not_a_real_column, bevor sie entfernt -> neue
use MySchema;
my $s = MySchema->connect('dbi:blahblahblah');
$s->resultset('Foo')->new({ real_column=>'value', not_a_real_column=>'some other thing' }); #win
jedoch aufgerufen wird, wenn das gleiche Schema über Katalysator :: Modell mit :: DBIC :: Schema ist die Reihenfolge unterschiedlich. Beim Versuch, ein neues Foo-Zeilenobjekt zu erstellen, schlägt Folgendes fehl, da not_a_real_column ungültig ist. Mit anderen Worten, die Argumente zu new werden nicht erst durch BUILDARGS durchlaufen -> new wird aufgerufen.
$c->model('MySchemaModel')->resultset('Foo')->new({ real_column=>'value', not_a_real_column=>'some other thing' }); #fails
Interessanterweise, wenn ich wrap around 'new' => sub {} statt um 'BUILDARGS' => sub {} ist das Verhalten in beiden Fällen gleich, und funktioniert gut, aber nach meinem Verständnis Elch-Dogma besagt, dass man sich niemals mit neuen Dingen anlegen soll.
Wer kümmert sich darum, mir zu erklären, warum das der Fall ist oder ob es einen besseren Weg gibt?