From: Sven Schöling <s.schoeling@linet-services.de>
Date: Fri, 29 May 2015 14:36:46 +0000 (+0200)
Subject: ConventionManager: foreign_key Benennung
X-Git-Tag: release-3.3.0beta~63
X-Git-Url: http://wagnertech.de/git?a=commitdiff_plain;h=83a78eea7bb24102f0b255bd350b7dd343e7a8e4;p=kivitendo-erp.git

ConventionManager: foreign_key Benennung

Der Standard Conventionmanager von Rose versucht irgendwelche
singular/plural Magic um aus dem key einen guten Namen zu kriegen.

Das klappt antürlich mal wieder nicht.

Wir haben aber einen besseren Mechanismus dafür,
SL::DB::Helper::Mappings.

Also werden jetzt die dafür benutzt.
---

diff --git a/SL/DB/Helper/ConventionManager.pm b/SL/DB/Helper/ConventionManager.pm
index 35c6b1ef2..830d34cda 100644
--- a/SL/DB/Helper/ConventionManager.pm
+++ b/SL/DB/Helper/ConventionManager.pm
@@ -26,4 +26,53 @@ sub auto_manager_base_class {
   return 'SL::DB::Helper::Manager';
 }
 
+sub auto_foreign_key_name
+{
+  my($self, $f_class, $current_name, $key_columns, $used_names) = @_;
+
+  my $f_meta = $f_class->meta or return $current_name;
+  my $package_name = SL::DB::Helper::Mappings::get_name_for_table($f_meta->table);
+  my $name = $package_name || $current_name;
+
+  if(keys %$key_columns == 1)
+  {
+    my($local_column, $foreign_column) = %$key_columns;
+
+    # Try to lop off foreign column name.  Example:
+    # my_foreign_object_id -> my_foreign_object
+    if($local_column =~ s/_$foreign_column$//i)
+    {
+      $name = $local_column;
+    }
+    else
+    {
+      $name = $package_name || $current_name;
+    }
+  }
+
+  # Avoid method name conflicts
+  if($self->method_name_conflicts($name) || $used_names->{$name})
+  {
+    foreach my $s ('_obj', '_object')
+    {
+      # Try the name with a suffix appended
+      unless($self->method_name_conflicts($name . $s) ||
+             $used_names->{$name . $s})
+      {
+        return $name . $s;
+      }
+    }
+
+    my $i = 1;
+
+    # Give up and go with numbers...
+    $i++  while($self->method_name_conflicts($name . $i) ||
+                $used_names->{$name . $i});
+
+    return $name . $i;
+  }
+
+  return $name;
+}
+
 1;