[Dbix-class] Schema reference object disapears from my resultset when building collections

Jason Wieland jason-dbix at patnjay.org
Thu Apr 12 09:59:07 GMT 2007


Hello,
I hope everyone is having a good day.  I've been pulling my hair out
about this issue for a while and I hope someone can help me.  First let
me commend the authors for DBIx,  after 8 years of witting sql I'm
getting pretty sick of it, thank you.

I have a two layered system:
first perl module called pcGame.pm that handles business logic
and a second module called PocketCombat.pm that handles the data access
layer

OO'ish style to separate the Data Objects from the Business Objects.
Obviously I integrated DBIx into my Data Objects.  Everything was going
fine until I started building collections (object factories).

I want to gather all games from a certain customer (similar to gathering
all books from an author, from the common examples).

pcGame.pm:
.....
$games = PocketDO::PocketCombat->find( -owner => $profile );
......

($games is an array ref of all the game objects that are owned by a profile)

PocketCombat.pm
.....
   my $rs = $self->_dataRs->search(
                                    {
                                        'me.profile' => $in{-owner}->id
                                    },
                                    );

    my @games;
    while (my $game_rs = $rs->next) {
        my $game = __PACKAGE__->_new($pkg);
        $game->{data} = $game_rs;
        $game->{id} = $game->{data}->gameid;
        push @games, $game;
    }
return \@games;


When I start to query the data in pcGame.pm I get this error
Can't call method "source" on an undefined value at
/usr/lib/perl5/site_perl/5.8.8/DBIx/Class/ResultSource.pm line 907.

Everything in $game->{data} works great until it is returned back to
pcGame.pm

It looks like part of the resultset data structure vanishes, in
particular the 'schema' object reference.
This is what a Dumper of the first element of the array looks like
before it is returned:
http://www.patnjay.org/pre_return_datastructure.txt
and right after it is returned it looks like this
http://www.patnjay.org/post_return_datastructure.txt

The only change between the two dumps is that 'schema' => undef

I have found two roundabout solutions that I don't like.  If in the Data
layer while looping through the rs->next, I call all my accessors that I
plan on using
$game->type;
$game->state;
.....
If I preload all this data it will be accessible from the pcGame.pm
However this make maintenance a nightmare.

The second (crappy) solution is to clone the resultset as I add it the
object
$game->{data} = clone($game_rs);
instead of
$game->{data} = $game_rs;
Clone coming from http://search.cpan.org/~rdf/Clone-0.22/Clone.pm

I would rather not do this because Clone has other issues that I would
need to deal with.

Anyone see this issue before?  Or have any suggestions.

Thanks,

Jason Wieland




More information about the Dbix-class mailing list