aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/connection_adapters
diff options
context:
space:
mode:
authorYves Senn <yves.senn@gmail.com>2014-06-06 17:24:46 +0200
committerYves Senn <yves.senn@gmail.com>2014-06-26 22:03:48 +0200
commite2ef25710682d884b2e6f5e99d47f18eb7083c68 (patch)
tree2024740056e51305e2d5bdf049407f4aca7ae731 /activerecord/lib/active_record/connection_adapters
parent5add8b8d6d27afac9fe46bcee09cd341fb124294 (diff)
downloadrails-e2ef25710682d884b2e6f5e99d47f18eb7083c68.tar.gz
rails-e2ef25710682d884b2e6f5e99d47f18eb7083c68.tar.bz2
rails-e2ef25710682d884b2e6f5e99d47f18eb7083c68.zip
fk: `add_foreign_key` and `remove_foreign_key` for PostgreSQL adapter.
Diffstat (limited to 'activerecord/lib/active_record/connection_adapters')
-rw-r--r--activerecord/lib/active_record/connection_adapters/abstract_adapter.rb5
-rw-r--r--activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb27
-rw-r--r--activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb4
3 files changed, 36 insertions, 0 deletions
diff --git a/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb b/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb
index cc494a7f40..294ed6d7bf 100644
--- a/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb
+++ b/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb
@@ -233,6 +233,11 @@ module ActiveRecord
false
end
+ # Does this adapter support creating foreign key constraints?
+ def supports_foreign_keys?
+ false
+ end
+
# This is meant to be implemented by the adapters that support extensions
def disable_extension(name)
end
diff --git a/activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb b/activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb
index b2aeb3a058..f09ce113d6 100644
--- a/activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb
+++ b/activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb
@@ -448,6 +448,33 @@ module ActiveRecord
execute "ALTER INDEX #{quote_column_name(old_name)} RENAME TO #{quote_table_name(new_name)}"
end
+ def add_foreign_key(from_table, to_table, options = {})
+ foreign_key_column = options.fetch(:column)
+ referenced_column = "id"
+ foreign_key_name = foreign_key_name(from_table, options)
+ execute <<-SQL
+ALTER TABLE #{quote_table_name(from_table)}
+ADD CONSTRAINT #{foreign_key_name}
+ FOREIGN KEY (#{quote_column_name(foreign_key_column)})
+ REFERENCES #{quote_table_name(to_table)} (#{quote_column_name(referenced_column)})
+ SQL
+ end
+
+ def remove_foreign_key(from_table, options = {})
+ foreign_key_name = foreign_key_name(from_table, options)
+ execute <<-SQL
+ALTER TABLE #{quote_table_name(from_table)}
+DROP CONSTRAINT #{foreign_key_name}
+ SQL
+ end
+
+ def foreign_key_name(table_name, options)
+ options.fetch(:name) do
+ column_name = options.fetch(:column)
+ "#{table_name}_#{column_name}_fk"
+ end
+ end
+
def index_name_length
63
end
diff --git a/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb b/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb
index be4ae47d09..34262cf91d 100644
--- a/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb
+++ b/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb
@@ -159,6 +159,10 @@ module ActiveRecord
true
end
+ def supports_foreign_keys?
+ true
+ end
+
def index_algorithms
{ concurrently: 'CONCURRENTLY' }
end