Fixed prefetch bug and added a test for it (spotted by Purge)
Matt S Trout [Fri, 23 Sep 2005 16:48:37 +0000 (16:48 +0000)]
lib/DBIx/Class/ResultSet.pm
t/run/16joins.tl

index db8d56d..3297235 100644 (file)
@@ -86,9 +86,10 @@ sub _construct_object {
     $new = $self->{class}->_row_to_object(\@cols, \@main);
     PRE: foreach my $pre (@{$self->{attrs}{prefetch}}) {
       my $rel_obj = $self->{class}->_relationships->{$pre};
-      my @pre_cols = $rel_obj->{class}->columns;
+      my $pre_class = $self->{class}->resolve_class($rel_obj->{class});
+      my @pre_cols = $pre_class->_select_columns;
       my @vals = splice(@row, 0, scalar @pre_cols);
-      my $fetched = $rel_obj->{class}->_row_to_object(\@pre_cols, \@vals);
+      my $fetched = $pre_class->_row_to_object(\@pre_cols, \@vals);
       $self->{class}->throw("No accessor for prefetched $pre")
         unless defined $rel_obj->{attrs}{accessor};
       if ($rel_obj->{attrs}{accessor} eq 'single') {
index 89d9947..3f7e596 100644 (file)
@@ -6,7 +6,7 @@ BEGIN {
     eval "use DBD::SQLite";
     plan $@
         ? ( skip_all => 'needs DBD::SQLite for testing' )
-        : ( tests => 21 );
+        : ( tests => 22 );
 }
 
 # test the abstract join => SQL generator
@@ -119,6 +119,8 @@ ok(!exists $cd[0]->{_relationship_data}{liner_notes}, 'No prefetch for NULL LEFT
 
 is($cd[1]->{_relationship_data}{liner_notes}->notes, 'Buy Whiskey!', 'Prefetch for present LEFT JOIN');
 
+is(ref $cd[1]->liner_notes, 'DBICTest::LinerNotes', 'Prefetch returns correct class');
+
 is($cd[2]->{_inflated_column}{artist}->name, 'Caterwauler McCrae', 'Prefetch on parent object ok');
 
 # count the SELECTs