From: Paul Makepeace Date: Thu, 3 Nov 2005 16:25:47 +0000 (+0000) Subject: * made HasOne::has_one and HasMany::has_many look more similar as a route to possible... X-Git-Tag: v0.05005~186 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=dcf8330b075eee8c71d30e0fa31289d162482fe4;p=dbsrgits%2FDBIx-Class.git * made HasOne::has_one and HasMany::has_many look more similar as a route to possible refactor * ensured all calls against $f_class were preceded by a check to see if it loaded OK * added diagnostic notes on what foreign key name was guessed --- diff --git a/lib/DBIx/Class/Relationship/HasMany.pm b/lib/DBIx/Class/Relationship/HasMany.pm index 2efebb7..00dd986 100644 --- a/lib/DBIx/Class/Relationship/HasMany.pm +++ b/lib/DBIx/Class/Relationship/HasMany.pm @@ -8,21 +8,23 @@ sub has_many { eval "require $f_class"; - if (!ref $cond) { + unless (ref $cond) { + my ($pri, $too_many) = keys %{ $class->_primaries }; + $class->throw( "has_many can only infer join for a single primary key; ${class} has more" ) + if $too_many; my $f_key; + my $f_class_loaded = eval { $f_class->_columns }; + my $guess; if (defined $cond && length $cond) { $f_key = $cond; - $class->throw( "No such column ${f_key} on foreign class ${f_class}" ) - unless ($@ || $f_class->_columns->{$f_key}); + $guess = "caller specified foreign key '$f_key'"; } else { $class =~ /([^\:]+)$/; - $f_key = lc $1 if $f_class->_columns->{lc $1}; - $class->throw( "Unable to resolve foreign key for has_many from ${class} to ${f_class}" ) - unless $f_key; + $f_key = lc $1; # go ahead and guess; best we can do + $guess = "using our class name '$class' as foreign key"; } - my ($pri, $too_many) = keys %{ $class->_primaries }; - $class->throw( "has_many can only infer join for a single primary key; ${class} has more" ) - if $too_many; + $class->throw("No such column ${f_key} on foreign class ${f_class} ($guess)") + if $f_class_loaded && !exists $f_class->_columns->{$f_key}; $cond = { "foreign.${f_key}" => "self.${pri}" }, } diff --git a/lib/DBIx/Class/Relationship/HasOne.pm b/lib/DBIx/Class/Relationship/HasOne.pm index 584ed2a..b9ab33d 100644 --- a/lib/DBIx/Class/Relationship/HasOne.pm +++ b/lib/DBIx/Class/Relationship/HasOne.pm @@ -19,15 +19,22 @@ sub _has_one { $class->throw( "might_have/has_one can only infer join for a single primary key; ${class} has more" ) if $too_many; my $f_key; - if ($cond) { + my $f_class_loaded = eval { $f_class->_columns }; + my $guess; + if (defined $cond && length $cond) { $f_key = $cond; - } elsif ($f_class->_columns->{$rel}) { + $guess = "caller specified foreign key '$f_key'"; + } elsif ($f_class_loaded && $f_class->_columns->{$rel}) { $f_key = $rel; + $guess = "using given relationship '$rel' for foreign key"; } else { ($f_key, $too_many) = keys %{ $f_class->_primaries }; $class->throw( "might_have/has_one can only infer join for a single primary key; ${f_class} has more" ) if $too_many; + $guess = "using primary key of foreign class for foreign key"; } + $class->throw("No such column ${f_key} on foreign class ${f_class} ($guess)") + if $f_class_loaded && !exists $f_class->_columns->{$f_key}; $cond = { "foreign.${f_key}" => "self.${pri}" }; } $class->add_relationship($rel, $f_class,