In my application, there is are projects, tags, and profiles (users).
Projects can be tagged by multiple profiles. Each tag has a many-to-many
relationship both projects and profiles. There's a mapping table
(tag_project_profile_map) with a 3-column primary key that relates those
three tables.
I've defined classes for Tag, Project and Profile, and also a mapping
class for TagProjectProfileMap. These are all spelled out in more detail
at the bottom of the message.
I want to add an tag entry to a project, specifying both the name of the
tag, and the user who created it. I can do this:
my $project = Project->new( id => 1);
$project->load;
$project->tags( { name = 'cool_stuff' } );
$project->save;
but it sets the profile_id to 0 in the mapping table. Not surprising,
but not what I want.
I'd like to be able to add tags to a project as follows (specifying the
missing primary key value):
$project->tags( { name = 'cool_stuff', profile_id => 1 } );
$project->save;
However, this gives me an error because the 'tags' table doesn't
actually have a profile_id, only the mapping table does.
I looked at trying define a custom primary_key_generator() function in
my TagProjectProfileMap, but I didn't see that I could get the
additional parameters.
Is there some magic I can use to make this happen, or can I only create
entries in the mapping table directly:
my $mapping = TagProjectProfileMap->new(
{project_id => 1,
tag_id => 2,
profile_id => 3});
$mapping->save;
Many thanks,
- jud
Here are the details of my db and classes:
DB TABLE SETUP
===================
table projects (
id int not null primary key,
name varchar(255) NOT NULL ,
);
table tags (
id int not null primary key
name varchar(255) NOT NULL,
INDEX (name)
);
table profiles (
id int not null primary key
username varchar(255) NOT NULL
INDEX (username)
);
table tag_project_profile_map (
tag_id int not null references tags (id),
profile_id int not null references profiles (id),
project_id int not null references project (id),
PRIMARY KEY (tag_id, project_id, profile_id )
);
Rose::DB::Object classes
=========================
package Tag;
use base 'My::Rose::DB::Object';
__PACKAGE___->meta->setup(
table => 'tags',
...
relationships => [
profiles => {
type => 'many to many',
map_class => 'TagProjectProfileMap',
map_from => 'tag',
map_to => 'profile',
},
projects => {
type => 'many to many',
map_class => 'TagProjectProfileMap',
map_from => 'tag',
map_to => 'projects',
},
],
);
package Project;
use base 'My::Rose::DB::Object';
__PACKAGE___->meta->setup(
table => 'profiles',
...
relationships => [
tags => {
type => 'many to many',
map_class => 'TagProjectProfileMap',
map_to => 'tag',
map_from => 'profile',
},
],
);
package TagProjectProfileMap;
use base My::Rose::DB::Object;
__PACKAGE__->meta->setup(
table => 'tag_project_profile_map',
...
primary_keys = [ qw(tag_id project_id profile_id) ],
foreign_keys => [ qw( project_id profile_id tag_id ) ],
],
);
-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Rose-db-object mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/rose-db-object