Fran Fabrizio wrote:
> Now, how do you represent in the model a
> complex query that joins across 5 of the nouns?
Others have already commented on this, but I want to point out that this
is a general OO modelling question, not an MVC one, and there are many
resources available to help you learn this stuff. I'd suggest getting
to your local computer book store and browsing through some OO
programming titles.
> In your concert example, if I wanted to define a report that showed me
> all of the seats that were purchased by people from New Jersey with a
> Mastercard in the last week, how would I represent that?
That's a tricky one, because it doesn't make much sense to put all that
logic about finding users' home states and payment types into a Concert
class. You could manipulate the objects to accomplish this:
my @wanted_seats;
my @seats = Model::Concert->findSeatsReservedAfter($date);
foreach my $seat (@seats) {
if ($seat->person()->address()->state() = 'NJ') {
push @wanted_seats, $seat;
}
}
As you can see it gets messy fast, and I didn't even cover the
Mastercard part. It would probably have terruble performance too. This
is why people usually just write this kind of report as a big SQL query
instead. You can make a model object called ConcertSeatSearch:
@seats = Model::ConcertSeatSearch->findSeats(
reserved_after => $date,
payment_type => $card,
user_state => $state,
);
Just be careful that you don't end up making this into something that
mirrors the SQL exactly. There might be 4 tables involved in finding
out what kind of credit card the user had, but that gets hidden behind
this API. If you find yourself writing classes that take options like
"where => 'date > ' . $date" you are reinventing SQL, and you've lost
your abstraction.
- Perrin