Module: Foreigner::ConnectionAdapters::MysqlAdapter

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

Instance Method Summary collapse

Methods included from Sql2003

#add_foreign_key, #supports_foreign_keys?

Instance Method Details

#foreign_keys(table_name) ⇒ Object



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/foreigner/connection_adapters/mysql_adapter.rb', line 16

def foreign_keys(table_name)
  fk_info = select_all %{
    SELECT fk.referenced_table_name as 'to_table'
          ,fk.referenced_column_name as 'primary_key'
          ,fk.column_name as 'column'
          ,fk.constraint_name as 'name'
    FROM information_schema.key_column_usage fk
    WHERE fk.referenced_column_name is not null
      AND fk.table_schema = '#{@config[:database]}'
      AND fk.table_name = '#{table_name}'
  }

  create_table_info = select_one("SHOW CREATE TABLE #{quote_table_name(table_name)}")["Create Table"]

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

    if create_table_info =~ /CONSTRAINT #{quote_column_name(row['name'])} FOREIGN KEY .* REFERENCES .* ON DELETE (CASCADE|SET NULL)/
      if $1 == 'CASCADE'
        options[:dependent] = :delete
      elsif $1 == 'SET NULL'
        options[:dependent] = :nullify
      end
    end
    ForeignKeyDefinition.new(table_name, row['to_table'], options)
  end
end

#remove_foreign_key(table, options) ⇒ Object



6
7
8
9
10
11
12
13
14
# File 'lib/foreigner/connection_adapters/mysql_adapter.rb', line 6

def remove_foreign_key(table, options)
  if Hash === options
    foreign_key_name = foreign_key_name(table, options[:column], options)
  else
    foreign_key_name = foreign_key_name(table, "#{options.to_s.singularize}_id")
  end

  execute "ALTER TABLE #{quote_table_name(table)} DROP FOREIGN KEY #{quote_column_name(foreign_key_name)}"
end