Module: Foreigner::ConnectionAdapters::SQLite3Adapter

Includes:
Sql2003
Defined in:
lib/foreigner/connection_adapters/sqlite3_adapter.rb

Instance Method Summary collapse

Methods included from Sql2003

#add_foreign_key, #foreign_key_definition, #supports_foreign_keys?

Instance Method Details

#foreign_keys(table_name) ⇒ Object



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
# File 'lib/foreigner/connection_adapters/sqlite3_adapter.rb', line 8

def foreign_keys(table_name)
  foreign_keys = []
  create_table_info = select_value %{
SELECT sql
FROM sqlite_master
WHERE sql LIKE '%FOREIGN KEY%'
AND name = '#{table_name}'
}
unless create_table_info.nil?
  fk_columns = create_table_info.scan(/FOREIGN KEY\s*\(\"([^\"]+)\"\)/)
  fk_tables = create_table_info.scan(/REFERENCES\s*\"([^\"]+)\"/)
  fk_references = create_table_info.scan(/REFERENCES[^\,]+/)
  if fk_columns.size == fk_tables.size && fk_references.size == fk_columns.size
    fk_columns.each_with_index do |fk_column, index|
      if fk_references[index] =~ /ON DELETE CASCADE/
        fk_references[index] = :delete
      elsif fk_references[index] =~ /ON DELETE SET NULL/
        fk_references[index] = :nullify
      else
        fk_references[index] = nil
      end
      foreign_keys << ForeignKeyDefinition.new(table_name, fk_tables[index][0], :column => fk_column[0], :dependent => fk_references[index])
    end
  end
end
foreign_keys
end