From 879a4c920663a2244cd2cff758406ff8dc2a9265 Mon Sep 17 00:00:00 2001 From: ayaya zhao Date: Wed, 21 Oct 2020 14:05:02 +0800 Subject: [PATCH] Fix rename_index removing old index with symbols Some adapters (sqlite3 and older mysql/mariadb) do not support to rename an index directly. That causes rename_index cannot find an old index to remove. --- .../connection_adapters/abstract/schema_statements.rb | 2 ++ activerecord/test/cases/migration/index_test.rb | 9 +++++++++ 2 files changed, 11 insertions(+) diff --git a/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb b/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb index 9c40a30e9d..93c4340fce 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb @@ -890,6 +890,8 @@ def remove_index(table_name, column_name = nil, **options) # rename_index :people, 'index_people_on_last_name', 'index_users_on_last_name' # def rename_index(table_name, old_name, new_name) + old_name = old_name.to_s + new_name = new_name.to_s validate_index_length!(table_name, new_name) # this is a naive implementation; some DBs may support this more efficiently (PostgreSQL, for instance) diff --git a/activerecord/test/cases/migration/index_test.rb b/activerecord/test/cases/migration/index_test.rb index 4074c5d875..670cc3ed49 100644 --- a/activerecord/test/cases/migration/index_test.rb +++ b/activerecord/test/cases/migration/index_test.rb @@ -37,6 +37,15 @@ def test_rename_index assert connection.index_name_exists?(table_name, "new_idx") end + def test_rename_index_with_symbol + # keep the names short to make Oracle and similar behave + connection.add_index(table_name, [:foo], name: :old_idx) + connection.rename_index(table_name, :old_idx, :new_idx) + + assert_not connection.index_name_exists?(table_name, "old_idx") + assert connection.index_name_exists?(table_name, "new_idx") + end + def test_rename_index_too_long too_long_index_name = good_index_name + "x" # keep the names short to make Oracle and similar behave