method
foreign_keys
v8.1.1 -
Show latest stable
- Class:
ActiveRecord::ConnectionAdapters::PostgreSQL::SchemaStatements
foreign_keys(table_name)public
No documentation available.
# File activerecord/lib/active_record/connection_adapters/postgresql/schema_statements.rb, line 604
def foreign_keys(table_name)
scope = quoted_scope(table_name)
fk_info = internal_exec_query(<<~SQL, "SCHEMA", allow_retry: true, materialize_transactions: false)
SELECT t2.oid::regclass::text AS to_table, c.conname AS name, c.confupdtype AS on_update, c.confdeltype AS on_delete, c.convalidated AS valid, c.condeferrable AS deferrable, c.condeferred AS deferred, c.conrelid, c.confrelid,
(
SELECT array_agg(a.attname ORDER BY idx)
FROM (
SELECT idx, c.conkey[idx] AS conkey_elem
FROM generate_subscripts(c.conkey, 1) AS idx
) indexed_conkeys
JOIN pg_attribute a ON a.attrelid = t1.oid
AND a.attnum = indexed_conkeys.conkey_elem
) AS conkey_names,
(
SELECT array_agg(a.attname ORDER BY idx)
FROM (
SELECT idx, c.confkey[idx] AS confkey_elem
FROM generate_subscripts(c.confkey, 1) AS idx
) indexed_confkeys
JOIN pg_attribute a ON a.attrelid = t2.oid
AND a.attnum = indexed_confkeys.confkey_elem
) AS confkey_names
FROM pg_constraint c
JOIN pg_class t1 ON c.conrelid = t1.oid
JOIN pg_class t2 ON c.confrelid = t2.oid
JOIN pg_namespace n ON c.connamespace = n.oid
WHERE c.contype = 'f'
AND t1.relname = #{scope[:name]}
AND n.nspname = #{scope[:schema]}
ORDER BY c.conname
SQL
fk_info.map do |row|
to_table = Utils.unquote_identifier(row["to_table"])
column = decode_string_array(row["conkey_names"])
primary_key = decode_string_array(row["confkey_names"])
options = {
column: column.size == 1 ? column.first : column,
name: row["name"],
primary_key: primary_key.size == 1 ? primary_key.first : primary_key
}
options[:on_delete] = extract_foreign_key_action(row["on_delete"])
options[:on_update] = extract_foreign_key_action(row["on_update"])
options[:deferrable] = extract_constraint_deferrable(row["deferrable"], row["deferred"])
options[:validate] = row["valid"]
ForeignKeyDefinition.new(table_name, to_table, options)
end
end