rename_column是否照顾索引?

说,我们有这样的东西:

add_column :users, :single, :boolean add_index :users, :single 

然后我们再做

 rename_column :users, :single, :married 

ActiveRecord和/或数据库是否也会处理索引的重命名,还是我必须手动删除索引并重新添加索引?

对于PostgreSQL, rename_column被实现为一个简单的ALTER TABLE ... RENAME COLUMN ...并且保留索引。

MySQL版本(它们都是)执行ALTER TABLE ... CHANGE ...并且还保留索引。

SQLite版本似乎复制整个表(与索引),删除旧的,然后将副本复制回原始表名称。 复制似乎在复制索引时处理列重命名:

 def copy_table(from, to, options = {}) #... copy_table_indexes(from, to, options[:rename] || {}) 

和里面copy_table_indexes

 columns = index.columns.map {|c| rename[c] || c }.select do |column| to_column_names.include?(column) end 

因此,标准的驱动程序将保留您的索引,当你做一个rename_column和SQLite驱动程序去做一些努力。

API文档没有指定任何特定的行为,尽pipe如此,其他驱动程序可能做其他事情。 最接近的文件来说,有关索引的任何事情是这在active_record/migration.rb

rename_column(table_name, column_name, new_column_name) :重命名列,但保留types和内容。

我想任何车手都会保留这些指标,但是没有保证。 司机作家肯定是愚蠢的不保存索引。

这不是一个明确或权威的答案,但是如果你使用标准的PostgreSQL,MySQL(或者其中之一)或者SQLite驱动程序,你的索引应该被保留下来。


请注意,即使索引本身存在列重命名,也不保证索引名称将被更改。 这不应该是一个问题,除非你正在做的事情(如手动删除它)关心索引名称,而不是涉及哪些列。

上面的行为在Rails 4中改变了 :

  • 在Rails 4.0中,当列或表被重命名时,相关的索引也被重命名。 如果您有重新命名索引的迁移,则不再需要它们。

因此,ActiveRecord将自动重新命名表或列时重新命名索引以匹配新的表或列的名称。 感谢sequielo在这个单挑上。

    Interesting Posts