From: Justin Guenther Date: Thu, 24 Aug 2006 17:58:38 +0000 (+0000) Subject: fixed set_$rel (from many_to_many) to accept a listref X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=4d3a827d;p=dbsrgits%2FDBIx-Class-Historic.git fixed set_$rel (from many_to_many) to accept a listref --- diff --git a/lib/DBIx/Class/Relationship/Base.pm b/lib/DBIx/Class/Relationship/Base.pm index 9797b7c..8409165 100644 --- a/lib/DBIx/Class/Relationship/Base.pm +++ b/lib/DBIx/Class/Relationship/Base.pm @@ -410,7 +410,7 @@ B relationships.> =over 4 -=item Arguments: (@hashrefs | @objs) +=item Arguments: (\@hashrefs | \@objs) =back @@ -418,18 +418,22 @@ B relationships.> my @roles = $schema->resultset('Role')->search({ role => { '-in' -> ['Fred', 'Barney'] } } ); - $actor->set_roles(@roles); - # Replaces all of $actors previous roles with the two named + $actor->set_roles(\@roles); + # Replaces all of $actor's previous roles with the two named -Replace all the related objects with the given list of objects. This does a -C B to remove the association between the -current object and all related objects, then calls C repeatedly to -link all the new objects. +Replace all the related objects with the given reference to a list of +objects. This does a C B to remove the +association between the current object and all related objects, then calls +C repeatedly to link all the new objects. Note that this means that this method will B delete any objects in the table on the right side of the relation, merely that it will delete the link between them. +Due to a mistake in the original implementation of this method, it will also +accept a list of objects or hash references. This is B and will be +removed in a future version. + =head2 remove_from_$rel B relationships.> diff --git a/lib/DBIx/Class/Relationship/ManyToMany.pm b/lib/DBIx/Class/Relationship/ManyToMany.pm index 65eab45..09cd751 100644 --- a/lib/DBIx/Class/Relationship/ManyToMany.pm +++ b/lib/DBIx/Class/Relationship/ManyToMany.pm @@ -60,8 +60,9 @@ sub many_to_many { @_ > 0 or $self->throw_exception( "{$set_meth} needs a list of objects or hashrefs" ); + my @to_set = (ref($_[0] eq 'ARRAY') ? @{ $_[0] } : @_); $self->search_related($rel, {})->delete; - $self->$add_meth(shift) while (defined $_[0]); + $self->$add_meth(shift) for (@to_set); }; *{"${class}::${remove_meth}"} = sub {