Module: SchemaPlus::ForeignKeys::Middleware::Dumper::Tables

Defined in:
lib/schema_plus/foreign_keys/middleware/dumper.rb

Overview

index and foreign key constraint definitions are dumped inline in the create_table block. (This is done for elegance, but also because Sqlite3 does not allow foreign key constraints to be added to a table after it has been defined.)

Defined Under Namespace

Modules: SQLite3

Instance Method Summary collapse

Instance Method Details

#after(env) ⇒ Object

Ignore the foreign key dumps at the end of the schema; we’ll put them in/near their tables



41
42
43
# File 'lib/schema_plus/foreign_keys/middleware/dumper.rb', line 41

def after(env)
  env.dump.final.reject!{ |it| it =~/foreign_key/ }
end

#before(env) ⇒ Object



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/schema_plus/foreign_keys/middleware/dumper.rb', line 14

def before(env)

  @inline_fks = Hash.new{ |h, k| h[k] = [] }
  @backref_fks = Hash.new{ |h, k| h[k] = [] }

  env.connection.tables.each do |table|
    if (fks = env.connection.foreign_keys(table)).any?
      env.dump.data.has_fks = true
      @inline_fks[table] = fks
      env.dump.depends(table, fks.collect(&:to_table))
    end
  end

  # Normally we dump foreign key constraints inline in the table
  # definitions, both for visual cleanliness and because sqlite3
  # doesn't allow foreign key constraints to be added afterwards.
  # But in case there's a cycle in the constraint references, some
  # constraints will need to be broken out then added later.  (Adding
  # constraints later won't work with sqlite3, but that means sqlite3
  # won't let you create cycles in the first place.)
  break_fk_cycles(env) while env.dump.strongly_connected_components.any?{|component| component.size > 1}

  env.dump.data.inline_fks = @inline_fks
  env.dump.data.backref_fks = @backref_fks
end