aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb
diff options
context:
space:
mode:
authorYves Senn <yves.senn@gmail.com>2014-06-10 10:59:18 +0200
committerYves Senn <yves.senn@gmail.com>2014-06-26 22:03:48 +0200
commit09b3a2847ca51d0e5dcebcb636d8770b19c397a7 (patch)
tree00d830e0b75f72253861907e5514b84b6a9c3e13 /activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb
parente2ef25710682d884b2e6f5e99d47f18eb7083c68 (diff)
downloadrails-09b3a2847ca51d0e5dcebcb636d8770b19c397a7.tar.gz
rails-09b3a2847ca51d0e5dcebcb636d8770b19c397a7.tar.bz2
rails-09b3a2847ca51d0e5dcebcb636d8770b19c397a7.zip
fk: add `foreign_keys` for PostgreSQL adapter.
Diffstat (limited to 'activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb')
-rw-r--r--activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb24
1 files changed, 24 insertions, 0 deletions
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 f09ce113d6..b87fb85ae2 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,30 @@ module ActiveRecord
execute "ALTER INDEX #{quote_column_name(old_name)} RENAME TO #{quote_table_name(new_name)}"
end
+ def foreign_keys(table_name)
+ fk_info = select_all <<-SQL
+SELECT t2.relname AS to_table, a1.attname AS column, a2.attname AS primary_key, c.conname AS name, c.confdeltype AS dependency
+FROM pg_constraint c
+JOIN pg_class t1 ON c.conrelid = t1.oid
+JOIN pg_class t2 ON c.confrelid = t2.oid
+JOIN pg_attribute a1 ON a1.attnum = c.conkey[1] AND a1.attrelid = t1.oid
+JOIN pg_attribute a2 ON a2.attnum = c.confkey[1] AND a2.attrelid = t2.oid
+JOIN pg_namespace t3 ON c.connamespace = t3.oid
+WHERE c.contype = 'f'
+ AND t1.relname = #{quote(table_name)}
+ AND t3.nspname = ANY (current_schemas(false))
+ORDER BY c.conname
+ SQL
+
+ fk_info.map do |row|
+ options = {
+ column: row['column'],
+ name: row['name'],
+ primary_key: row['primary_key'] }
+ ForeignKeyDefinition.new(table_name, row["to_table"], options)
+ end
+ end
+
def add_foreign_key(from_table, to_table, options = {})
foreign_key_column = options.fetch(:column)
referenced_column = "id"