2010-12-03 16 views
3

J'ai un objet DBIx::Class représentant une enchère eBay. La table sous-jacente a une colonne de description qui contient beaucoup de données. La colonne de description n'est presque jamais utilisée, elle n'est donc pas incluse dans la liste des colonnes DBIx::Class de cette table. De cette façon, la plupart des requêtes ne récupèrent pas les données de description de l'enchère.Ajout dynamique de colonnes à une classe DBIx :: ResultSet

Cependant, j'ai un script qui a besoin de cette colonne. Dans ce premier cas, je veux accéder au contenu de la colonne de description comme je toute autre colonne:

$auction->description 

Comment puis-je accomplir cela sans forcer toutes les autres requêtes pour aller chercher la colonne de description?

Répondre

3

Dans les anciennes versions de DBIx::Class (pas sûr du numéro de version), ce qui suit travaillait:

my $rs = $schema->resultset('Auctions'); 
my $lots = $rs->search(
    undef, 
    { '+select' => 'description', '+as' => 'description' }, 
); 

Cela ne semble pas fonctionner pour les mises à jour des lignes dans les versions modernes de DBIx::Class. Essayer que, avec une mise à jour

$auction->update({ description => '...'}) 

sous DBIx::Class 0,08123 donne l'erreur suivante: "DBIx :: Class :: relations CascadeActions :: update(): Aucun description de la colonne à ..."

En supposant que le script nécessitant la colonne supplémentaire s'exécute dans son propre processus. Vous pouvez faire quelque chose comme ceci:

my $rs = $schema->resultset('Auctions'); 
$rs->result_source->add_columns('description'); 
YourApp::Schema::Lots->add_columns('description'); 
YourApp::Schema::Lots->register_column('description'); 

Bien sûr, c'est un changement global. Après avoir ajouté la colonne, l'autre code dans le même processus commencera à extraire la colonne description dans les requêtes. Sans oublier, c'est plutôt moche.