aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib
diff options
context:
space:
mode:
authorYves Senn <yves.senn@gmail.com>2014-06-10 13:28:38 +0200
committerYves Senn <yves.senn@gmail.com>2014-06-26 22:03:48 +0200
commit69c711f38cac85e9c8bdbe286591bf88ef720bfa (patch)
tree8d9b10a585c7ba3d2c0c5fa73e38167f388b20e8 /activerecord/lib
parenta48b675d54101b048228d1011ffa426c2b7fe94d (diff)
downloadrails-69c711f38cac85e9c8bdbe286591bf88ef720bfa.tar.gz
rails-69c711f38cac85e9c8bdbe286591bf88ef720bfa.tar.bz2
rails-69c711f38cac85e9c8bdbe286591bf88ef720bfa.zip
fk: dump foreign keys to schema.rb
respect `table_name_prefix` and `table_name_suffix`.
Diffstat (limited to 'activerecord/lib')
-rw-r--r--activerecord/lib/active_record/migration.rb4
-rw-r--r--activerecord/lib/active_record/schema_dumper.rb22
2 files changed, 25 insertions, 1 deletions
diff --git a/activerecord/lib/active_record/migration.rb b/activerecord/lib/active_record/migration.rb
index 01c001e692..12eaf36156 100644
--- a/activerecord/lib/active_record/migration.rb
+++ b/activerecord/lib/active_record/migration.rb
@@ -645,7 +645,9 @@ module ActiveRecord
unless @connection.respond_to? :revert
unless arguments.empty? || [:execute, :enable_extension, :disable_extension].include?(method)
arguments[0] = proper_table_name(arguments.first, table_name_options)
- arguments[1] = proper_table_name(arguments.second, table_name_options) if method == :rename_table
+ if [:rename_table, :add_foreign_key].include?(method)
+ arguments[1] = proper_table_name(arguments.second, table_name_options)
+ end
end
end
return super unless connection.respond_to?(method)
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