X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FSchema%2FLoader%2FRelBuilder.pm;h=a292f2dd001926aefdc669914d4f6cf1dd4c4b06;hb=26f1c8c92bdbd5bf27e48005a1f3291ee7731a70;hp=196d09e073073100ce0c3b2f16a85fabbe1d8a10;hpb=253ea8454088e0904e4c48527c8c759c23591e45;p=dbsrgits%2FDBIx-Class-Schema-Loader.git diff --git a/lib/DBIx/Class/Schema/Loader/RelBuilder.pm b/lib/DBIx/Class/Schema/Loader/RelBuilder.pm index 196d09e..a292f2d 100644 --- a/lib/DBIx/Class/Schema/Loader/RelBuilder.pm +++ b/lib/DBIx/Class/Schema/Loader/RelBuilder.pm @@ -121,8 +121,19 @@ sub _inflect_singular { return Lingua::EN::Inflect::Number::to_S($relname); } +sub _array_eq { + my ($a, $b) = @_; + + return unless @$a == @$b; + + for (my $i = 0; $i < @$a; $i++) { + return unless $a->[$i] eq $b->[$i]; + } + return 1; +} + sub generate_code { - my ($self, $local_moniker, $rels) = @_; + my ($self, $local_moniker, $rels, $uniqs) = @_; my $all_code = {}; @@ -187,6 +198,16 @@ sub generate_code { delete $rev_cond{$_}; } + my $remote_method = 'has_many'; + + # If the local columns have a UNIQUE constraint, this is a one-to-one rel + my $primary = [ $self->{schema}->source($local_moniker)->primary_columns ]; + if (_array_eq($primary, $local_cols) || + grep { _array_eq($_->[1], $local_cols) } @$uniqs) { + $remote_method = 'might_have'; + $local_relname = $self->_inflect_singular($local_relname); + } + push(@{$all_code->{$local_class}}, { method => 'belongs_to', args => [ $remote_relname, @@ -197,7 +218,7 @@ sub generate_code { ); push(@{$all_code->{$remote_class}}, - { method => 'has_many', + { method => $remote_method, args => [ $local_relname, $local_class, \%rev_cond,