2010-12-03 8 views
3

Ich habe ein DBIx::Class Objekt, das eine eBay-Auktion darstellt. Die zugrunde liegende Tabelle enthält eine Beschreibungsspalte, die viele Daten enthält. Die Beschreibungsspalte wird fast nie verwendet, daher ist sie in der Spaltenliste DBIx::Class für diese Tabelle nicht enthalten. Auf diese Weise rufen die meisten Abfragen die Auktionsbeschreibungsdaten nicht ab.Dynamisch Hinzufügen von Spalten zu einem DBIx :: Class ResultSet

Ich habe jedoch ein Skript, das diese Spalte benötigt. In diesem Fall möchte ich den Inhalt der Beschreibungsspalte zuzugreifen, als ich jede andere Spalte:

$auction->description 

Wie kann ich dies zu erreichen, ohne dass alle anderen Abfragen zwingt die Beschreibung Spalte zu holen?

Antwort

3

In älteren Versionen von DBIx::Class (nicht sicher, ob der Versionsnummer), verwendet die folgenden arbeiten:

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

, die nicht für Zeilenaktualisierungen unter modernen Versionen von DBIx::Class zu funktionieren scheint. Der Versuch, das mit einem Update

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

unter DBIx::Class 0,08123 den folgenden Fehler gibt: "DBIx :: Class :: Beziehung :: CascadeActions :: update(): Keine solche Spalte Beschreibung auf ..."

Angenommen, das Skript, das die zusätzliche Spalte benötigt, wird in einem eigenen Prozess ausgeführt. Sie können etwas tun:

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

Natürlich, das ist eine globale Veränderungen. Nach dem Hinzufügen der Spalte beginnt anderer Code im selben Prozess mit dem Abrufen der Spalte description in Abfragen. Ganz zu schweigen, es ist irgendwie hässlich.