Beefy Boxes and Bandwidth Generously Provided by pair Networks
Keep It Simple, Stupid

Re: Class::DBI and DB design

by tunaboy (Curate)
on Jun 06, 2003 at 22:15 UTC ( #263874=note: print w/replies, xml ) Need Help??

in reply to Class::DBI and DB design

I have a little more time now so I figured I might as well show how I would alter your schema to work with Class::DBI (I am not claiming this is the way you should do it, merely how I would):

package My::User; use base 'My::ClassDBI'; __PACKAGE__->table ('user'); __PACKAGE__->columns ( All => qw( uid name login ) ); __PACKAGE__->has_many( 'capabilities', 'My::UserCapability' => 'user' +); ### package My::Capability; use base 'My::ClassDBI'; __PACKAGE__->table ('capability'); __PACKAGE__->columns ( All => qw( capid name default ) ); __PACKAGE__->has_many( 'users', 'My::UserCapability' => 'capability' ) +; ### package My::UserCapability; use base 'My::ClassDBI'; __PACKAGE__->table ('user_capability'); # note the added primary key idx __PACKAGE__->columns ( All => qw( idx user capability ) ); __PACKAGE__->has_a( 'user' => 'My::User' ); __PACKAGE__->has_a( 'capability' => 'My::Capability' );

You could now print out all the capabilities for a user with:

foreach ( $user->capabilities() ) { print $_->capability->name(), "\n"; }
or all the users with a certain capability:
foreach ( $capability->users() ) { print $_->user->name(), "\n"; }
The users and capabilities methods might be better named as they don't really return a list of users or capabilites but rather return a list of My::UserCapability objects. But you could write a custom get_capabilities method such as:
sub get_capabilities { my ( $self ) = @_; my @capabilities = $self->capabilities(); return map { $_->capability->name() } @capabilities; }

It is a bit of work getting around the single primary key limitation of Class::DBI but IMHO well worth it.

NOTE: I think all the code is correct as given but I could be drastically wrong as it is late on a Friday afternoon.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://263874]
[GrandFather]: That's ok when the signal is a voltage, but there are three axis accelerometers, gyroscopes and magnetometers in these things! A little invention is needed at times!
[Corion]: GrandFather: Yeah, in that aspect, hardware is far more a black box than software
[GrandFather]: Oh, and the manufacturer tells lies too! I'm sure they don't mean to, but I know for sure some of the stuff they say is just wrong. It's possible they don't understand what we are asking, but that's not a good look either
[Corion]: GrandFather: Ah, unit testing hardware is fun, especially when the hardware is uncalibrated ...
[GrandFather]: Us: "What scaling do we need to apply to the numbers from the SDK for the wibble?". Them: "Oh, the numbers from the SDK for the wibble are already correct, they don't need scaling"
[GrandFather]: In our code: wibble range 1 scale by 1, range 2 scale by 2, range 3 scale by 4, range 4 scale by 8

How do I use this? | Other CB clients
Other Users?
Others imbibing at the Monastery: (7)
As of 2017-08-24 07:16 GMT
Find Nodes?
    Voting Booth?
    Who is your favorite scientist and why?

    Results (365 votes). Check out past polls.