Subject: | map_record_method shenanigans |
Date: | Wed, 5 Mar 2014 01:16:03 +0000 |
To: | "bug-Rose-DB-Object [...] rt.cpan.org" <bug-Rose-DB-Object [...] rt.cpan.org> |
From: | "DeVuyst, Justin D" <JDeVuyst [...] hearst.com> |
Hello,
We recently added:
manager_args => { with_map_records => 1, },
to a many-to-many relationship, lets call it bar, in one of our classes and after that
we were unable to set bar() with bar objects that were created through the rel like so:
$obj2->bar( $obj1->bar);
But using hash forms of the related objects works fine as well as bar objects that were
not sourced through the rel.
What seems to be happening is that the primary keys of the old map_records and their
"in_db" state are not being cleared out. This results in a new map_record never being
saved in the db because rose thinks it already exists, in a way. Here's a hacky and
minimal fix I worked up that solves our particular manifestation of the bug:
<snip>
@@ -5421,7 +5421,18 @@
# Create or retrieve map record, connected to self
if($map_record_method)
{
- $map_record = $object->$map_record_method() || $map_class->new;
+ $map_record = $object->$map_record_method();
+ if ( $map_record ) {
+ foreach my $method ($map_record->meta->primary_key_column_mutator_names)
+ {
+ $map_record->$method(undef);
+ }
+ $map_record->{STATE_IN_DB()} = 0;
+ }
+ else
+ {
+ $map_record = $map_class->new;
+ }
$map_record->init(%method_map_to_self, db => $db);
}
else
</snip>
We are using RDBO version 0.784. In addition to clearing the primary keys
perhaps all other columns not associated with the map classes should be cleared
as well - for consistency. Afterall, that's what happens when map_record_method
isn't involved in the operation.
Thanks,
jdv