aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib
diff options
context:
space:
mode:
authorYves Senn <yves.senn@gmail.com>2014-06-20 11:54:17 +0200
committerYves Senn <yves.senn@gmail.com>2014-06-26 22:03:49 +0200
commit8768305f20d12c40241396092a63e0d56269fefe (patch)
treed08715db2104792427e6e71de1294238cbead260 /activerecord/lib
parent8550ba307d712ebede0d0695b5172bb3e9af16c9 (diff)
downloadrails-8768305f20d12c40241396092a63e0d56269fefe.tar.gz
rails-8768305f20d12c40241396092a63e0d56269fefe.tar.bz2
rails-8768305f20d12c40241396092a63e0d56269fefe.zip
fk: use random digest names
The name of the foreign key is not relevant from a users perspective. Using random names resolves the urge to rename the foreign key when the respective table or column is renamed.
Diffstat (limited to 'activerecord/lib')
-rw-r--r--activerecord/lib/active_record/connection_adapters/abstract/schema_creation.rb2
-rw-r--r--activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb11
-rw-r--r--activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb20
-rw-r--r--activerecord/lib/active_record/schema_dumper.rb16
4 files changed, 36 insertions, 13 deletions
diff --git a/activerecord/lib/active_record/connection_adapters/abstract/schema_creation.rb b/activerecord/lib/active_record/connection_adapters/abstract/schema_creation.rb
index e495304376..5d13ee3633 100644
--- a/activerecord/lib/active_record/connection_adapters/abstract/schema_creation.rb
+++ b/activerecord/lib/active_record/connection_adapters/abstract/schema_creation.rb
@@ -30,7 +30,7 @@ FOREIGN KEY (#{quote_column_name(o.column)})
end
def visit_DropForeignKey(name)
- "DROP CONSTRAINT #{name}"
+ "DROP CONSTRAINT #{quote_column_name(name)}"
end
private
diff --git a/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb b/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb
index 2e47e68754..785cfd9dbc 100644
--- a/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb
+++ b/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb
@@ -35,7 +35,7 @@ module ActiveRecord
end
def primary_key
- options[:primary_key]
+ options[:primary_key] || default_primary_key
end
def on_delete
@@ -45,6 +45,15 @@ module ActiveRecord
def on_update
options[:on_update]
end
+
+ def custom_primary_key?
+ options[:primary_key] != default_primary_key
+ end
+
+ private
+ def default_primary_key
+ "id"
+ end
end
# Represents the schema of an SQL table in an abstract way. This class
diff --git a/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb b/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb
index 4da42717c1..e203767992 100644
--- a/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb
+++ b/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb
@@ -650,11 +650,10 @@ module ActiveRecord
return unless supports_foreign_keys?
options[:column] ||= foreign_key_column_for(to_table)
- primary_key = options.fetch(:primary_key, "id")
options = {
column: options[:column],
- primary_key: primary_key,
+ primary_key: options[:primary_key],
name: foreign_key_name(from_table, options),
on_delete: options[:on_delete],
on_update: options[:on_update]
@@ -674,8 +673,17 @@ module ActiveRecord
options = { column: foreign_key_column_for(options_or_to_table) }
end
+ fk_name_to_delete = options.fetch(:name) do
+ fk_to_delete = foreign_keys(from_table).detect {|fk| fk.column == options[:column] }
+ if fk_to_delete
+ fk_to_delete.name
+ else
+ raise ArgumentError, "Table '#{from_table}' has no foreign key on column '#{options[:column]}'"
+ end
+ end
+
at = create_alter_table from_table
- at.drop_foreign_key foreign_key_name(from_table, options)
+ at.drop_foreign_key fk_name_to_delete
execute schema_creation.accept at
end
@@ -686,11 +694,7 @@ module ActiveRecord
def foreign_key_name(table_name, options) # :nodoc:
options.fetch(:name) do
- identifier = "#{table_name}_#{options.fetch(:column)}_fk"
- if identifier.length > allowed_index_name_length
- raise ArgumentError, "Foreign key name '#{identifier}' is too long; the limit is #{allowed_index_name_length} characters"
- end
- identifier
+ "fk_rails_#{SecureRandom.hex(5)}"
end
end
diff --git a/activerecord/lib/active_record/schema_dumper.rb b/activerecord/lib/active_record/schema_dumper.rb
index 84ce725409..64bc68eefd 100644
--- a/activerecord/lib/active_record/schema_dumper.rb
+++ b/activerecord/lib/active_record/schema_dumper.rb
@@ -226,10 +226,20 @@ HEADER
parts = [
'add_foreign_key ' + remove_prefix_and_suffix(foreign_key.from_table).inspect,
remove_prefix_and_suffix(foreign_key.to_table).inspect,
- 'column: ' + foreign_key.column.inspect,
- 'primary_key: ' + foreign_key.primary_key.inspect,
- 'name: ' + foreign_key.name.inspect
]
+
+ if foreign_key.column != @connection.foreign_key_column_for(foreign_key.to_table)
+ parts << ('column: ' + foreign_key.column.inspect)
+ end
+
+ if foreign_key.custom_primary_key?
+ parts << ('primary_key: ' + foreign_key.primary_key.inspect)
+ end
+
+ if foreign_key.name !~ /^fk_rails_[0-9a-f]{10}$/
+ parts << ('name: ' + foreign_key.name.inspect)
+ end
+
parts << ('on_update: ' + foreign_key.on_update.inspect) if foreign_key.on_update
parts << ('on_delete: ' + foreign_key.on_delete.inspect) if foreign_key.on_delete