workaround for updating records with might_have plus tests
authorzby <zby@bd8105ee-0ff8-0310-8827-fb3f25b6796d>
Mon, 2 Feb 2009 14:49:33 +0000 (14:49 +0000)
committerzby <zby@bd8105ee-0ff8-0310-8827-fb3f25b6796d>
Mon, 2 Feb 2009 14:49:33 +0000 (14:49 +0000)
lib/DBIx/Class/ResultSet/RecursiveUpdate.pm
t/lib/RunTests.pm
t/var/dvdzbr.db

index 95725d0a5b9764ab58ebc5642092ccfe6d94c009..3929e4939b54d6fab6e1aa4c97107a1d7a822dc6 100644 (file)
@@ -14,6 +14,12 @@ sub recursive_update {
     if( blessed( $updates ) && $updates->isa( 'DBIx::Class::Row' ) ){
         return $updates;
     }
+    my %columns;
+    for my $name ( keys %$updates ){ 
+        if( $self->is_for_column( $name, $updates->{$name} ) ){
+            $columns{$name} = $updates->{$name};
+        }
+    }
     my $object;
 #    warn 'cond: ' . Dumper( $self->{cond} ); use Data::Dumper;
 #    warn 'where: ' . Dumper( $self->{attrs}{where} ); use Data::Dumper;
@@ -22,29 +28,27 @@ sub recursive_update {
         $self->{cond} = undef;
         $self->{attrs}{where} = undef;
         if( ! scalar @missing ){
-            $object = $self->find( $updates, { key => 'primary' } );
+            $object = $self->find( \%columns, { key => 'primary' } );
         }
     }
     else{
-        $object = $self->find( $updates, { key => 'primary' } );
+        $object = $self->find( \%columns, { key => 'primary' } );
     }
     $object ||= $self->new( {} );
 
     # first update columns and other accessors - so that later related records can be found
-    for my $name ( keys %$updates ){ 
-        if( $self->is_for_column( $object, $name, $updates->{$name} ) ) {
+    for my $name ( keys %columns ){ 
             $object->$name( $updates->{$name} );
-        }
     }
     for my $name ( keys %$updates ){ 
-        if($object->can($name) && !$self->is_for_column( $object, $name, $updates->{$name} ) ){
+        if($object->can($name) && !$self->is_for_column( $name, $updates->{$name} ) ){
 
             # updating relations that that should be done before the row is inserted into the database
             # like belongs_to
                 my $info = $object->result_source->relationship_info( $name );
                 if( $info and not $info->{attrs}{accessor} eq 'multi'
                         and 
-                    _master_relation_cond( $object, $info->{cond}, $self->_get_pk_for_related( $name ) )
+                    _master_relation_cond( $object->result_source, $info->{cond}, $self->_get_pk_for_related( $name ) )
                 ){
                     my $related_result = $object->related_resultset( $name );
                     my $resolved =  $self->result_source->resolve_condition(
@@ -91,7 +95,7 @@ sub recursive_update {
                 }
             }
             # might_have and has_one case
-            elsif ( ! _master_relation_cond( $object, $info->{cond}, $self->_get_pk_for_related( $name ) ) ){
+            elsif ( ! _master_relation_cond( $object->result_source, $info->{cond}, $self->_get_pk_for_related( $name ) ) ){
                 my $sub_object = $object->search_related( $name )->recursive_update( $value );
                 #$object->set_from_related( $name, $sub_object );
             }
@@ -100,20 +104,18 @@ sub recursive_update {
     return $object;
 }
 
-sub is_for_column { 
-    my( $self, $object, $name, $value ) = @_;
-    return 
-    $object->can($name)
-    && !( 
-        $object->result_source->has_relationship($name)
+sub is_for_column {
+    my( $self, $name, $value ) = @_;
+    my $source = $self->result_source;
+    return
+    $source->has_column($name)
+    && !(
+        $source->has_relationship($name)
         && ref( $value )
     )
-    && ( 
-        $object->result_source->has_column($name)
-        || !$object->can( 'set_' . $name )
-    )
 }
 
+
 sub is_m2m {
     my( $self, $relation ) = @_;
     my $rclass = $self->result_class;
@@ -177,14 +179,14 @@ sub _get_pk_for_related {
 }
 
 sub _master_relation_cond {
-    my ( $object, $cond, @foreign_ids ) = @_;
+    my ( $source, $cond, @foreign_ids ) = @_;
     my $foreign_ids_re = join '|', @foreign_ids;
     if ( ref $cond eq 'HASH' ){
         for my $f_key ( keys %{$cond} ) {
             # might_have is not master
             my $col = $cond->{$f_key};
             $col =~ s/self\.//;
-            if( $object->column_info( $col )->{is_auto_increment} ){
+            if( $source->column_info( $col )->{is_auto_increment} ){
                 return 0;
             }
             if( $f_key =~ /^foreign\.$foreign_ids_re/ ){
@@ -193,7 +195,7 @@ sub _master_relation_cond {
         }
     }elsif ( ref $cond eq 'ARRAY' ){
         for my $new_cond ( @$cond ) {
-            return 1 if _master_relation_cond( $object, $new_cond, @foreign_ids );
+            return 1 if _master_relation_cond( $source, $new_cond, @foreign_ids );
         }
     }
     return;
index cce65e02bda418cf5fbfcbb5dfda6e0686f19639..0c877f896d45dfa9ad1a93aee90a55c11aa06148 100644 (file)
@@ -9,7 +9,7 @@ use Test::More;
 sub run_tests{
     my $schema = shift;
 
-    plan tests => 24;
+    plan tests => 25;
     
     my $dvd_rs = $schema->resultset( 'Dvd' );
     my $user_rs = $schema->resultset( 'User' );
@@ -82,7 +82,10 @@ sub run_tests{
                 username => 'new name a',
                 name => 'new name a',
                 password => 'new password a',
-            }
+            },
+            liner_notes => {
+                notes => 'test note changed',
+            },
     };
     $dvd = $dvd_rs->recursive_update( $updates );
     
@@ -91,6 +94,8 @@ sub run_tests{
     is ( $dvd->owner->id, $another_owner->id, 'Owner updated' );
     is ( $dvd->current_borrower->name, 'new name a', 'Related record modified' );
     is ( $dvd->tags->count, 0, 'Tags deleted' );
+    is ( $dvd->liner_notes->notes, 'test note changed', 'might_have record changed' );
+
 
     # repeatable
     
index bac7b17abeec4cedd13cbebb9b52c3d7253f4e5c..6e962cf0e4836c48f4d389eb8e9a1ddf30daa566 100644 (file)
Binary files a/t/var/dvdzbr.db and b/t/var/dvdzbr.db differ
This page took 0.025673 seconds and 4 git commands to generate.