From 69c711f38cac85e9c8bdbe286591bf88ef720bfa Mon Sep 17 00:00:00 2001 From: Yves Senn Date: Tue, 10 Jun 2014 13:28:38 +0200 Subject: fk: dump foreign keys to schema.rb respect `table_name_prefix` and `table_name_suffix`. --- activerecord/lib/active_record/schema_dumper.rb | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'activerecord/lib/active_record/schema_dumper.rb') diff --git a/activerecord/lib/active_record/schema_dumper.rb b/activerecord/lib/active_record/schema_dumper.rb index e055d571ab..3db36458db 100644 --- a/activerecord/lib/active_record/schema_dumper.rb +++ b/activerecord/lib/active_record/schema_dumper.rb @@ -171,6 +171,8 @@ HEADER indexes(table, tbl) + foreign_keys(table, tbl) + tbl.rewind stream.print tbl.read rescue => e @@ -212,6 +214,26 @@ HEADER end end + def foreign_keys(table, stream) + return unless @connection.supports_foreign_keys? + + if (foreign_keys = @connection.foreign_keys(table)).any? + add_foreign_key_statements = foreign_keys.map do |foreign_key| + 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 + ] + ' ' + parts.join(', ') + end + + stream.puts add_foreign_key_statements.sort.join("\n") + stream.puts + end + end + def remove_prefix_and_suffix(table) table.gsub(/^(#{@options[:table_name_prefix]})(.+)(#{@options[:table_name_suffix]})$/, "\\2") end -- cgit v1.2.3 From 402f303f1d938cf2c7781d7734c4ff8e6b874f35 Mon Sep 17 00:00:00 2001 From: Yves Senn Date: Tue, 10 Jun 2014 14:26:50 +0200 Subject: fk: support dependent option (:delete, :nullify and :restrict). --- activerecord/lib/active_record/schema_dumper.rb | 2 ++ 1 file changed, 2 insertions(+) (limited to 'activerecord/lib/active_record/schema_dumper.rb') diff --git a/activerecord/lib/active_record/schema_dumper.rb b/activerecord/lib/active_record/schema_dumper.rb index 3db36458db..c415236c45 100644 --- a/activerecord/lib/active_record/schema_dumper.rb +++ b/activerecord/lib/active_record/schema_dumper.rb @@ -226,6 +226,8 @@ HEADER 'primary_key: ' + foreign_key.primary_key.inspect, 'name: ' + foreign_key.name.inspect ] + parts << ('dependent: ' + foreign_key.dependent.inspect) if foreign_key.dependent + ' ' + parts.join(', ') end -- cgit v1.2.3 From 6955d864ceb0ba994ef4fb4c5e866463f247944b Mon Sep 17 00:00:00 2001 From: Yves Senn Date: Wed, 11 Jun 2014 08:23:17 +0200 Subject: fk: rename `dependent` to `on_delete` --- activerecord/lib/active_record/schema_dumper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'activerecord/lib/active_record/schema_dumper.rb') diff --git a/activerecord/lib/active_record/schema_dumper.rb b/activerecord/lib/active_record/schema_dumper.rb index c415236c45..cdbb374510 100644 --- a/activerecord/lib/active_record/schema_dumper.rb +++ b/activerecord/lib/active_record/schema_dumper.rb @@ -226,7 +226,7 @@ HEADER 'primary_key: ' + foreign_key.primary_key.inspect, 'name: ' + foreign_key.name.inspect ] - parts << ('dependent: ' + foreign_key.dependent.inspect) if foreign_key.dependent + parts << ('on_delete: ' + foreign_key.on_delete.inspect) if foreign_key.on_delete ' ' + parts.join(', ') end -- cgit v1.2.3 From acd0287dc18a3fbba6fa4301cb31a7aecd22922b Mon Sep 17 00:00:00 2001 From: Yves Senn Date: Wed, 11 Jun 2014 08:47:53 +0200 Subject: fk: support for on_update --- activerecord/lib/active_record/schema_dumper.rb | 1 + 1 file changed, 1 insertion(+) (limited to 'activerecord/lib/active_record/schema_dumper.rb') diff --git a/activerecord/lib/active_record/schema_dumper.rb b/activerecord/lib/active_record/schema_dumper.rb index cdbb374510..9b46f7751b 100644 --- a/activerecord/lib/active_record/schema_dumper.rb +++ b/activerecord/lib/active_record/schema_dumper.rb @@ -226,6 +226,7 @@ HEADER 'primary_key: ' + foreign_key.primary_key.inspect, 'name: ' + foreign_key.name.inspect ] + 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 ' ' + parts.join(', ') -- cgit v1.2.3 From 0938d5305758dfcbec4e813c777bb627e82a5906 Mon Sep 17 00:00:00 2001 From: Yves Senn Date: Wed, 11 Jun 2014 11:35:26 +0200 Subject: fk: dump foreign keys at the bottom to make sure tables exist. --- activerecord/lib/active_record/schema_dumper.rb | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) (limited to 'activerecord/lib/active_record/schema_dumper.rb') diff --git a/activerecord/lib/active_record/schema_dumper.rb b/activerecord/lib/active_record/schema_dumper.rb index 9b46f7751b..84ce725409 100644 --- a/activerecord/lib/active_record/schema_dumper.rb +++ b/activerecord/lib/active_record/schema_dumper.rb @@ -91,7 +91,8 @@ HEADER end def tables(stream) - @connection.tables.sort.each do |tbl| + sorted_tables = @connection.tables.sort + sorted_tables.each do |tbl| next if ['schema_migrations', ignore_tables].flatten.any? do |ignored| case ignored when String; remove_prefix_and_suffix(tbl) == ignored @@ -102,6 +103,13 @@ HEADER end table(tbl, stream) end + + # dump foreign keys at the end to make sure all dependent tables exist. + if @connection.supports_foreign_keys? + sorted_tables.each do |tbl| + foreign_keys(tbl, stream) + end + end end def table(table, stream) @@ -171,8 +179,6 @@ HEADER indexes(table, tbl) - foreign_keys(table, tbl) - tbl.rewind stream.print tbl.read rescue => e @@ -215,8 +221,6 @@ HEADER end def foreign_keys(table, stream) - return unless @connection.supports_foreign_keys? - if (foreign_keys = @connection.foreign_keys(table)).any? add_foreign_key_statements = foreign_keys.map do |foreign_key| parts = [ @@ -233,7 +237,6 @@ HEADER end stream.puts add_foreign_key_statements.sort.join("\n") - stream.puts end end -- cgit v1.2.3 From 8768305f20d12c40241396092a63e0d56269fefe Mon Sep 17 00:00:00 2001 From: Yves Senn Date: Fri, 20 Jun 2014 11:54:17 +0200 Subject: 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. --- activerecord/lib/active_record/schema_dumper.rb | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) (limited to 'activerecord/lib/active_record/schema_dumper.rb') 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 -- cgit v1.2.3