提交 24e1aefb 编写于 作者: Y Yves Senn

fk: review corrections: indent, visibility, syntax, wording.

上级 8768305f
......@@ -18,21 +18,6 @@ def visit_AddColumn(o)
add_column_options!(sql, column_options(o))
end
def visit_AddForeignKey(o)
sql = <<-SQL
ADD CONSTRAINT #{quote_column_name(o.name)}
FOREIGN KEY (#{quote_column_name(o.column)})
REFERENCES #{quote_table_name(o.to_table)} (#{quote_column_name(o.primary_key)})
SQL
sql << " #{action_sql('DELETE', o.on_delete)}" if o.on_delete
sql << " #{action_sql('UPDATE', o.on_update)}" if o.on_update
sql
end
def visit_DropForeignKey(name)
"DROP CONSTRAINT #{quote_column_name(name)}"
end
private
def visit_AlterTable(o)
......@@ -58,6 +43,21 @@ def visit_TableDefinition(o)
create_sql
end
def visit_AddForeignKey(o)
sql = <<-SQL.strip_heredoc
ADD CONSTRAINT #{quote_column_name(o.name)}
FOREIGN KEY (#{quote_column_name(o.column)})
REFERENCES #{quote_table_name(o.to_table)} (#{quote_column_name(o.primary_key)})
SQL
sql << " #{action_sql('DELETE', o.on_delete)}" if o.on_delete
sql << " #{action_sql('UPDATE', o.on_update)}" if o.on_update
sql
end
def visit_DropForeignKey(name)
"DROP CONSTRAINT #{quote_column_name(name)}"
end
def column_options(o)
column_options = {}
column_options[:null] = o.null unless o.null.nil?
......@@ -108,9 +108,9 @@ def action_sql(action, dependency)
when :cascade then "ON #{action} CASCADE"
when :restrict then "ON #{action} RESTRICT"
else
raise ArgumentError, <<-MSG
'#{dependency}' is not supported for :on_update or :on_delete.
Supported values are: :nullify, :cascade, :restrict
raise ArgumentError, <<-MSG.strip_heredoc
'#{dependency}' is not supported for :on_update or :on_delete.
Supported values are: :nullify, :cascade, :restrict
MSG
end
end
......
......@@ -661,7 +661,7 @@ def add_foreign_key(from_table, to_table, options = {})
at = create_alter_table from_table
at.add_foreign_key to_table, options
execute schema_creation.accept at
execute schema_creation.accept(at)
end
def remove_foreign_key(from_table, options_or_to_table = {})
......@@ -675,6 +675,7 @@ def remove_foreign_key(from_table, options_or_to_table = {})
fk_name_to_delete = options.fetch(:name) do
fk_to_delete = foreign_keys(from_table).detect {|fk| fk.column == options[:column] }
if fk_to_delete
fk_to_delete.name
else
......@@ -685,19 +686,13 @@ def remove_foreign_key(from_table, options_or_to_table = {})
at = create_alter_table from_table
at.drop_foreign_key fk_name_to_delete
execute schema_creation.accept at
execute schema_creation.accept(at)
end
def foreign_key_column_for(table_name) # :nodoc:
"#{table_name.to_s.singularize}_id"
end
def foreign_key_name(table_name, options) # :nodoc:
options.fetch(:name) do
"fk_rails_#{SecureRandom.hex(5)}"
end
end
def dump_schema_information #:nodoc:
sm_table = ActiveRecord::Migrator.schema_migrations_table_name
......@@ -908,6 +903,12 @@ def create_table_definition(name, temporary, options, as = nil)
def create_alter_table(name)
AlterTable.new create_table_definition(name, false, {})
end
def foreign_key_name(table_name, options) # :nodoc:
options.fetch(:name) do
"fk_rails_#{SecureRandom.hex(5)}"
end
end
end
end
end
......@@ -510,7 +510,7 @@ def add_index(table_name, column_name, options = {}) #:nodoc:
end
def foreign_keys(table_name)
fk_info = select_all %{
fk_info = select_all <<-SQL.strip_heredoc
SELECT fk.referenced_table_name as 'to_table'
,fk.referenced_column_name as 'primary_key'
,fk.column_name as 'column'
......@@ -519,7 +519,7 @@ def foreign_keys(table_name)
WHERE fk.referenced_column_name is not null
AND fk.table_schema = '#{@config[:database]}'
AND fk.table_name = '#{table_name}'
}
SQL
create_table_info = select_one("SHOW CREATE TABLE #{quote_table_name(table_name)}")["Create Table"]
......@@ -537,15 +537,6 @@ def foreign_keys(table_name)
end
end
def extract_foreign_key_action(structure, name, action) # :nodoc:
if structure =~ /CONSTRAINT #{quote_column_name(name)} FOREIGN KEY .* REFERENCES .* ON #{action} (CASCADE|SET NULL|RESTRICT)/
case $1
when 'CASCADE'; :cascade
when 'SET NULL'; :nullify
end
end
end
# Maps logical Rails types to MySQL-specific data types.
def type_to_sql(type, limit = nil, precision = nil, scale = nil)
case type.to_s
......@@ -824,6 +815,15 @@ def configure_connection
# ...and send them all in one query
@connection.query "SET #{encoding} #{variable_assignments}"
end
def extract_foreign_key_action(structure, name, action) # :nodoc:
if structure =~ /CONSTRAINT #{quote_column_name(name)} FOREIGN KEY .* REFERENCES .* ON #{action} (CASCADE|SET NULL|RESTRICT)/
case $1
when 'CASCADE'; :cascade
when 'SET NULL'; :nullify
end
end
end
end
end
end
......@@ -449,18 +449,18 @@ def rename_index(table_name, old_name, new_name)
end
def foreign_keys(table_name)
fk_info = select_all <<-SQL
SELECT t2.relname AS to_table, a1.attname AS column, a2.attname AS primary_key, 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 t1.relname = #{quote(table_name)}
AND t3.nspname = ANY (current_schemas(false))
ORDER BY c.conname
fk_info = select_all <<-SQL.strip_heredoc
SELECT t2.relname AS to_table, a1.attname AS column, a2.attname AS primary_key, 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 t1.relname = #{quote(table_name)}
AND t3.nspname = ANY (current_schemas(false))
ORDER BY c.conname
SQL
fk_info.map do |row|
......
......@@ -170,13 +170,13 @@ def invert_change_column_null(args)
end
def invert_add_foreign_key(args)
from_table, to_table, add_options = *args
from_table, to_table, add_options = args
add_options ||= {}
if add_options[:name]
options = {name: add_options[:name]}
options = { name: add_options[:name] }
elsif add_options[:column]
options = {column: add_options[:column]}
options = { column: add_options[:column] }
else
options = to_table
end
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册