Skip to content

Commit

Permalink
refactor SQLite3Adapter#copy_table to prevent primary key redefinit…
Browse files Browse the repository at this point in the history
…ions. rails#6378
  • Loading branch information
senny committed Oct 28, 2012
1 parent c82f0d7 commit b104157
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 6 deletions.
Expand Up @@ -519,24 +519,22 @@ def move_table(from, to, options = {}, &block) #:nodoc:

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

Expand Down
9 changes: 8 additions & 1 deletion activerecord/test/cases/adapters/sqlite3/copy_table_test.rb
Expand Up @@ -32,6 +32,11 @@ def test_copy_table_renaming_column
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'])
Expand All @@ -43,7 +48,9 @@ def test_copy_table_with_index
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
Expand Down

0 comments on commit b104157

Please sign in to comment.