是否可以使用rails迁移重命名索引?

hec*_*rsq 36 migration ruby-on-rails

我知道有一个rename_column转变,但似乎rename_index不存在.

我必须使用remove_indexadd_index不是吗?

Not*_*hus 60

rename_index 应该给出字符串而不是符号.

rename_index :table_name, 'old_name', 'new_name'
Run Code Online (Sandbox Code Playgroud)

当我试图重命名一个表并且它是索引时,让我挠了一下头.Rails 3.2.3和MySQL.


Gui*_*ume 41

Rails 3提供了重命名索引的快捷方式:

rename_index :table_name, :old_name, :new_name
Run Code Online (Sandbox Code Playgroud)

http://guides.rubyonrails.org/migrations.html

顺便说一句,它除了删除旧的并添加新的之外没有什么作用:

http://apidock.com/rails/v2.3.8/ActiveRecord/ConnectionAdapters/SchemaStatements/rename_index

  • 正如nothus在下面的回答中指出的那样,索引名称必须以字符串形式给出,否则rename_index调用将无声地失败 (5认同)
  • rename_index似乎在Rails 3.1.3中实际上没有做任何事情.迁移似乎运行得很干净,但检查schema.rb并在MySQL中运行`SHOW INDEXES FROM table_name`显示索引保持它的先前名称. (3认同)

Gre*_*ass 16

从Rails 5开始(编辑:也在Rails 4中),重命名列也将自动重命名索引.


Tob*_*ede 1

您也可以在迁移中执行任意 SQL。

我们有一些辅助方法可以将外键添加到我们的表中:

def add_foreign_key(from_table, from_column, to_table)
  constraint_name = "fk_#{from_table}_#{from_column}"

  execute %{alter table #{from_table}
            add constraint #{constraint_name}
            foreign key (#{from_column})
            references #{to_table}(id)
           }
  end
Run Code Online (Sandbox Code Playgroud)

您可以使用数据库支持的任何 SQL。

  • 您可能必须使用“execute”的一种情况是,如果 Rails 添加了索引并根据表名称对其进行命名,那么您已经重命名了该表。例如,我创建了“users_roles”并进行了迁移以添加索引,Rails 将其命名为“index_users_roles_on_role_id”。然后我意识到我需要将该表重命名为“roles_users”。后来,当我尝试删除索引时,Rails 正在寻找一个名为“index_roles_users_on_role_id”的索引。因此,我必须在迁移中使用 `execute "DROP INDEX index_users_roles_on_role_id ON Roles_users"`。(这是针对 MySQL 的。) (2认同)