On Sun, Apr 19, 2009 at 2:49 PM, J. Shirley <[email protected]> wrote:

> Catalyst::Model::DBIC::Schema simply looks at all available result sets and
> creates a model class that is a transparent wrapper.  It should function the
> exact same.
>
> The code that does this is:
>
>     foreach my $moniker ($self->schema->sources) {
>         my $classname = "${class}::$moniker";
>         *{"${classname}::ACCEPT_CONTEXT"} = sub {
>             shift;
>             shift->model($model_name)->resultset($moniker);
>
>         }
>
>     }
>
> As you can see, all it is doing is a short-hand to
> $c->model('DB')->resultset($moniker) ($moniker being the name, 'Language',
> $class being 'Quiz::Model::DB')
>
> That's how it works, but without seeing actual code in your application I'm
> not sure why you are getting unexpected results.
>

Okay, I've reduced my app to its most basic components, and renamed its
elements for simplicity.  A is the highest-level component; it has_many B's;
each B has_many C's.  Here are the source files, using what is hopefully an
intuitively obvious shell-like expansion notation for brevity:

File Quiz/Schema/{A,B,C}.pm:

package Quiz::Schema::{A,B.C};
use base 'DBIx::Class';
__PACKAGE__->load_components('Core');
__PACKAGE__->table('{A,B,C}');
__PACKAGE__->add_columns('{a,b,c}', {,'a','b'});
__PACKAGE__->set_primary_key('{a,b,c}');
1;

Quiz/Schema/A.pm and Quiz/Schema/B.pm each have one extra configuration
statement:

__PACKAGE__->has_many({bs,cs} => 'Quiz::Schema::{B,C});

In my database, table A has a single column "a" and two rows with values 1
and 2.  Table B has columns "b" and "a" and two rows: b=1, a=1 and b=2,
a=2.   And table C has columns "c" and "b" and three rows: c=1, b=1; c=2,
b=2; and c=3, b=2.

To sum up: There are two A's, each of which has one B.  Of the two B's, one
has one C, and the other has two C's.

In my controller module, I have this routine:

sub index :Path :Args(0) {
  my ($self, $c) = @_;
  $c->stash->{as} = [ $c->model('DB::A')->all ];
  $c->stash->{template} = 'index.tt';
}

This is the content of my index.tt file:

[% FOR a IN as; FOR b IN a.bs; b.cs; "<br>"; END; END %]

And this is the output in my browser:

Quiz::Model::DB::C=HASH(0xc75e78)
ARRAY(0xc0c96c)

Now the corresponding plain DBIx::Class app, as I understand it, would be
similar to this:

for my $a ($schema->resultset('A')->all) {
  for my $b ($a->bs) {
    my $cs = $b->cs;
    print ref $cs, "\n";
  }
}

When I run this program, the output is:

DBIx::Class::ResultSet
DBIx::Class::ResultSet

I get a ResultSet back when I ask for any B's list of C's.  But when I go
through Catalyst, I (apparently) get an unblessed array reference back if
the B in question has more than one C.  So sometimes I get a genuine object
back, other times I get plain old data.  How am I supposed to code around
that?

Or probably the more correct question:  Where do my expectations diverge
from Catalyst's reality?
_______________________________________________
List: [email protected]
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/[email protected]/
Dev site: http://dev.catalyst.perl.org/

Reply via email to