mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
refactor SQLite3Adapter#copy_table
to prevent primary key redefinitions. #6378
This commit is contained in:
parent
c82f0d76e4
commit
b104157314
2 changed files with 11 additions and 6 deletions
|
@ -519,24 +519,22 @@ module ActiveRecord
|
|||
|
||||
def copy_table(from, to, options = {}) #:nodoc:
|
||||
from_primary_key = primary_key(from)
|
||||
options[:primary_key] = from_primary_key if from_primary_key != 'id'
|
||||
unless options[:primary_key]
|
||||
options[:id] = columns(from).detect{|c| c.name == 'id'}.present? && from_primary_key == 'id'
|
||||
end
|
||||
options[:id] = false
|
||||
create_table(to, options) do |definition|
|
||||
@definition = definition
|
||||
@definition.primary_key(from_primary_key) if from_primary_key.present?
|
||||
columns(from).each do |column|
|
||||
column_name = options[:rename] ?
|
||||
(options[:rename][column.name] ||
|
||||
options[:rename][column.name.to_sym] ||
|
||||
column.name) : column.name
|
||||
next if column_name == from_primary_key
|
||||
|
||||
@definition.column(column_name, column.type,
|
||||
:limit => column.limit, :default => column.default,
|
||||
:precision => column.precision, :scale => column.scale,
|
||||
:null => column.null)
|
||||
end
|
||||
@definition.primary_key(from_primary_key) if from_primary_key
|
||||
yield @definition if block_given?
|
||||
end
|
||||
|
||||
|
|
|
@ -32,6 +32,11 @@ class CopyTableTest < ActiveRecord::TestCase
|
|||
end
|
||||
end
|
||||
|
||||
def test_copy_table_allows_to_pass_options_to_create_table
|
||||
@connection.create_table('blocker_table')
|
||||
test_copy_table('customers', 'blocker_table', force: true)
|
||||
end
|
||||
|
||||
def test_copy_table_with_index
|
||||
test_copy_table('comments', 'comments_with_index') do
|
||||
@connection.add_index('comments_with_index', ['post_id', 'type'])
|
||||
|
@ -43,7 +48,9 @@ class CopyTableTest < ActiveRecord::TestCase
|
|||
end
|
||||
|
||||
def test_copy_table_without_primary_key
|
||||
test_copy_table('developers_projects', 'programmers_projects')
|
||||
test_copy_table('developers_projects', 'programmers_projects') do
|
||||
assert_nil @connection.primary_key('programmers_projects')
|
||||
end
|
||||
end
|
||||
|
||||
def test_copy_table_with_id_col_that_is_not_primary_key
|
||||
|
|
Loading…
Reference in a new issue