Module: Webdack::UUIDMigration::SchemaHelpers

Included in:
Helpers
Defined in:
lib/webdack/uuid_migration/schema_helpers.rb

Instance Method Summary collapse

Instance Method Details

#create_foreign_keys(foreign_keys) ⇒ Object



54
55
56
57
58
59
60
61
# File 'lib/webdack/uuid_migration/schema_helpers.rb', line 54

def create_foreign_keys(foreign_keys)
  foreign_keys.each do |fk_key_spec|
    foreign_key_spec = fk_key_spec.dup
    from_table = foreign_key_spec.delete(:from_table)
    to_table = foreign_key_spec.delete(:to_table)
    add_foreign_key from_table, to_table, **foreign_key_spec
  end
end

#drop_foreign_keys(foreign_keys) ⇒ Object



46
47
48
49
50
51
52
# File 'lib/webdack/uuid_migration/schema_helpers.rb', line 46

def drop_foreign_keys(foreign_keys)
  foreign_keys.each do |fk_key_spec|
    foreign_key_spec = fk_key_spec.dup
    from_table = foreign_key_spec.delete(:from_table)
    remove_foreign_key from_table, name: foreign_key_spec[:name]
  end
end

#extract_foreign_key_action(specifier) ⇒ Object



38
39
40
41
42
43
44
# File 'lib/webdack/uuid_migration/schema_helpers.rb', line 38

def extract_foreign_key_action(specifier)
  case specifier
  when "c"; :cascade
  when "n"; :nullify
  when "r"; :restrict
  end
end

#foreign_keys_into(to_table_name) ⇒ Object



4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/webdack/uuid_migration/schema_helpers.rb', line 4

def foreign_keys_into(to_table_name)
  to_primary_key = primary_key(to_table_name)


  fk_info = select_all <<-SQL
  SELECT t2.oid::regclass::text AS to_table, a2.attname AS primary_key, t1.relname as from_table, a1.attname AS column, c.conname AS name, c.confupdtype AS on_update, c.confdeltype AS on_delete
      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 t2.oid::regclass::text = #{quote(to_table_name)}
    AND a2.attname = #{quote(to_primary_key)}
  ORDER BY t1.relname, a1.attname
  SQL

  fk_info.map do |row|
    options = {
        to_table: row['to_table'],
        primary_key: row['primary_key'],
        from_table: row['from_table'],
        column: row['column'],
        name: row['name']
    }

    options[:on_delete] = extract_foreign_key_action(row['on_delete'])
    options[:on_update] = extract_foreign_key_action(row['on_update'])

    options
  end
end