Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 重命名列是否负责索引?_Ruby On Rails_Ruby On Rails 3_Activerecord_Rails Activerecord_Database Indexes - Fatal编程技术网

Ruby on rails 重命名列是否负责索引?

Ruby on rails 重命名列是否负责索引?,ruby-on-rails,ruby-on-rails-3,activerecord,rails-activerecord,database-indexes,Ruby On Rails,Ruby On Rails 3,Activerecord,Rails Activerecord,Database Indexes,比如说,我们有这样的东西: add_column :users, :single, :boolean add_index :users, :single 然后我们就开始了 rename_column :users, :single, :married ActiveRecord和/或数据库会同时处理索引的重命名吗?还是我必须手动删除索引并再次添加它?对于PostgreSQL,rename\u column是作为一个简单的ALTER TABLE实现的。。。重命名列…,这样会保留索引 MySQL版

比如说,我们有这样的东西:

add_column :users, :single, :boolean
add_index :users, :single
然后我们就开始了

rename_column :users, :single, :married

ActiveRecord和/或数据库会同时处理索引的重命名吗?还是我必须手动删除索引并再次添加它?

对于PostgreSQL,
rename\u column
是作为一个简单的
ALTER TABLE实现的。。。重命名列…
,这样会保留索引

MySQL版本(两者)都做了一个
altertable。。。更改…
,这也会保留索引

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

def copy_table(from, to, options = {})
  #...
  copy_table_indexes(from, to, options[:rename] || {})
和内部
复制表索引

columns = index.columns.map {|c| rename[c] || c }.select do |column|
  to_column_names.include?(column)
end
因此,当您执行
rename\u列时,标准驱动程序将保留您的索引,而SQLite驱动程序将努力做到这一点

API文档没有指定任何特定的行为,因此其他驱动程序可能会执行其他操作。文档中最接近于说明索引的内容是
active\u record/migration.rb

重命名列(表名、列名、新列名)
:重命名列,但保留类型和内容

我认为任何驱动程序都会保留索引,但不能保证;如果驱动程序编写者不保存索引,那肯定是愚蠢的

这不是一个确定的或权威的答案,但如果您使用标准的PostgreSQL、MySQL(其中任何一个)或SQLite驱动程序,则应该保留索引


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

上述行为:


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

因此,当您重命名表或列时,ActiveRecord将自动重命名索引以匹配新的表或列名。感谢您的提醒。

我的迁移(通过更改)有效地更新了索引,但没有更新索引的名称。名称仍然是“索引[表格名称]”在[旧的表格名称]”——Rails 3.2.11,sqlite3@Sorry-Im-a-N00b:谢谢你提醒我,我为后人添加了一个关于名称的小注释。@不对称:我所说的“保留”是指“确保列重命名后索引仍然存在”。不过,索引的名称不一定会更改以匹配新的列名。“在Rails 4.0中,当重命名列或表时,相关的索引也会被重命名。如果您进行了重命名索引的迁移,则不再需要这些索引。”,来源:@sequielo:感谢您的提醒,我已经更新了答案以说明此更改。